写惯了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) |