在编写DLL之前,确保你安装了VC或者VS IDE,并正确配置了环境变量,可以在dos下调用cl和link命令,你可以在dos下输入cl或者link来测试是否正确配置了环境变量。关于这方面的配置不作介绍。关于链接选项和编译选项,请参考MSDN。本文中提到的dumpbin和depends的使用,以后再做说明。
入口函数
动态链接库的入口函数时可选的,也就是说你可以不必指定,入口函数默认是DllMain,当然也可以自己指定入口函数,只要你不调用CRT的库函数,你就可以用连接选项ENTRY来指定你自己的入口函数;如果该DLL是一个纯资源动态连接库,那么没有入口函数,并且在连接选项中指定NOENTRY。
特别注意链接选项中的NOENTRY,必须要你在dll库中没有调用CRT的库函数时,才能通过,否则链接错误,提示找不到外部函数main,因此一般在纯资源DLL库中才使用该选项。ENTRY也有这个问题。
LIBCMT.lib(crt0.obj) : error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup
MY.DLL : fatal error LNK1120: 1 unresolved externals
NMAKE : fatal error U1077: '"C:\Program Files\Microsoft Visual Studio 8\VC\BIN\link.EXE"' : return code '0x460' Stop.
MY.DLL : fatal error LNK1120: 1 unresolved externals
NMAKE : fatal error U1077: '"C:\Program Files\Microsoft Visual Studio 8\VC\BIN\link.EXE"' : return code '0x460' Stop.
编写第一个WIN32 DLL
你可以选择IDE的AppWizard来生成一个Win32 Dll项目,也可以用记事本来写DLL。下面介绍记事本方式来编写DLL。打开记事本,输入如下代码,保存为mydll.cpp:
1 int add(int a,int b)
2 {
3 return a+b;
4 }
5
6 int subtract(int a,int b)
7 {
8 return a-b;
9 }
2 {
3 return a+b;
4 }
5
6 int subtract(int a,int b)
7 {
8 return a-b;
9 }