Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4043135
  • 博文数量: 536
  • 博客积分: 10470
  • 博客等级: 上将
  • 技术积分: 4825
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-26 14:08
文章分类

全部博文(536)

文章存档

2024年(3)

2021年(1)

2019年(1)

2017年(1)

2016年(2)

2013年(2)

2012年(10)

2011年(43)

2010年(10)

2009年(17)

2008年(121)

2007年(252)

2006年(73)

分类:

2007-09-19 13:29:08

写惯了Linux下的东西来到Windows下真是不习惯, 特别是哪个VC, 让我搞不清楚我点一下鼠标到底系统后面做了什么。在Linux下几乎每做一件事情我大概的知道系统在后面干了什么,就算出问题了,自己也好找到底在什么地方出问题了。Windows就把我当傻子了,来个VC将编译、连接、编辑等等功能自己全给完成了, 但后面到底每一步是谁做的让我找的好辛苦啊,没办法了解一下也是挺好。
我是带着Linux开发的思想走近Windows的, 下面就写个简单的DLL来实践一下。

-------------
在做我的实验前你得安装VC,设置以下简单的环境变量(其实设置该环境变量的目的就是让我们输入cl, link可以让操作系统一下子找到)
我的环境变量是:
C:\>echo %PATH%
C:\WINNT\system32;C:\WINNT;C:\WINNT\System32\Wbem;C:\Program Files\Microsoft Visual Studio\VC98\Bin;C:\Program Files\Microsoft Visual Studio\Common\Tools\WinNT;C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin;C:\Program Files\Microsoft Visual Studio\Common\Tools;C:\Program Files\Microsoft Visual Studio\VC98\bin

我的环境:
Microsoft Windows 2000 [Version 5.00.2195]
(C) 版权所有 1985-2000 Microsoft Corp.

C:\>cl
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

usage: cl [ option... ] filename... [ /link linkoption... ]

C:\>link
Microsoft (R) Incremental Linker Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

usage: LINK [options] [files] [@commandfile]
/* 哎, 习惯了命令行没办法, 这些全部在哪个win+R: cmd 中输入的。 */
-----------------
/*
  网上介绍什么是DLL, DLL有什么好处 ...... 东西太多了, 我就不在这里多说了, 以实践为主。
  你不需要VC来编辑下面的东西, 使用你感觉可以的文本编辑器就可以了(记事本、EditPlus ......)
  也就是我将编辑和编译分开了, 让我们明白我干了什么, 要是用哪个VC这一点那一点我就糊涂了, 没办法还没进化到使用VC的层次来。

  你先建立一个新的文件夹来保存我们做的小测试程序:
  我的就叫gandll, 下面是源码:
 */
=================
/**
 * gandll\gandll.h
 * 这个是gandll.h文件内容
 * 那个破文件路径用个"\"这样的, Linux下是"/", 总是搞错了。
 */
#ifdef _cplusplus
extern "C"
{
#endif

#define    GAN_EXPORT32    __declspec(dllexport)

GAN_EXPORT32 int add2(int a, int b);

#ifdef _cplusplus
}
#endif

--------------
/**
 * gandll\gandll.c
 * 这个是gandll.c文件
 * 编译命令是:
 *    cl /LD /W4 gandll.c
 */
#include "gandll.h"

int add2(int a, int b)
{
  return (a + b);
}

================
这是我编译的:
C:\gandll>cl /W4 /LD gandll.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

gandll.c
Microsoft (R) Incremental Linker Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/out:gandll.dll
/dll
/implib:gandll.lib
gandll.obj
   Creating library gandll.lib and object gandll.exp

C:\gandll>dir
 驱动器 C 中的卷是 SYSTEM
 卷的序列号是 68FA-7398

 C:\gan\ts\gandll 的目录

2007-09-19  11:30                 .
2007-09-19  11:30                 ..
2007-09-19  11:34                  167 gandll.h
2007-09-19  11:36                  116 gandll.c
2007-09-19  12:05                  313 gandll.obj
2007-09-19  12:05               40,960 gandll.dll
2007-09-19  12:05                1,896 gandll.lib
2007-09-19  12:05                  527 gandll.exp
2007-09-19  11:37                 dlltest
               6 个文件         43,979 字节
               3 个目录  4,724,350,976 可用字节

执行完该编译后你就可以在该目录下看到多出来的gandll.dll, gandll.lib, gandll.exp三个文件。 当然哪个dlltest目录是我自己新建的, 用来存放测试程序用的(接下来的测试程序就是在哪个目录下完成的)。

================
/*
 * 这个就是哪个测试程序文件(文件名: gandll/dlltest/dlltest.h)
 */
#ifndef DLLTEST_H
#define    DLLTEST_H

#define    GAN_IMPORT32    __declspec(dllimport)

GAN_IMPORT32 int add2(int a, int b);

#endif /* #ifndef DLLTEST_H */

-----------------
/*
 * 这个哪个测试程序文件(文件名: gandll/dlltest/dlltest.c)
 */
#include
#include "dlltest.h"

int main(int argc, char **argv)
{
    printf("Test DLL values: %d \n", add2(1, 2));

    return (0);
}
======================
编译的办法(将哪个gandll.dll, gandll.lib文件复制到该目录下面):
C:\gandll\dlltest>cl gandll.lib /W4 dlltest.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

dlltest.c
dlltest.c(4) : warning C4100: 'argv' : unreferenced formal parameter
dlltest.c(4) : warning C4100: 'argc' : unreferenced formal parameter
Microsoft (R) Incremental Linker Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/out:dlltest.exe
gandll.lib
dlltest.obj

C:\gandll\dlltest>dir
 驱动器 C 中的卷是 SYSTEM
 卷的序列号是 68FA-7398

 C:\gan\ts\gandll\dlltest 的目录

2007-09-19  11:37                 .
2007-09-19  11:37                 ..
2007-09-19  11:39                  149 dlltest.h
2007-09-19  11:41                  143 dlltest.c
2007-09-19  11:36                1,896 gandll.lib
2007-09-19  11:36               40,960 gandll.dll
2007-09-19  13:20                  514 dlltest.obj
2007-09-19  13:20               40,960 dlltest.exe
               6 个文件         84,622 字节
               2 个目录  4,724,195,328 可用字节

C:\gandll\dlltest>dlltest
Test DLL values: 3
==========================
以上就是我的测试事例, 下面在说说为什么吧, 以及每个这样做的原因。
转到下篇写吧:::
DLL 实践说明 (cplusplus的使用)
DLL 实践说明 (DllMain的使用)
阅读(1973) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~