手把手教你用v c++弄一个win32的dll

现在咱们开始手把手教你用VC++弄一个WIN32的DLL。第一步得搭好开发环境。 要是你想从零开始写代码,不想要那些系统给的模板干扰,就选那个“empty”选项,点击Finish就行。这时候你会发现工程目录里连个.h文件都没有,直接编译肯定会报错。 不过换个思路选“simple”选项也不错。Finish之后系统会自动给你生成StdAfx.h和StdAfx.cpp这两个预编译头文件,还有个simple.cpp里头有个框架但没写具体代码。要注意这个simple.cpp是没有对应的simple.h的,所有的声明都在StdAfx.h里面。 等你把这个编译链接一下,Debug目录里就能看到一个DLL出来了。不过这时候没有.lib文件,你要是想用隐式链接得自己多留意点。 要是觉得还不够详细,继续选“some”选项就行了。这时候除了之前的那些文件,还会多一个some.h出来。把函数实现写在some.cpp里编译完就能看到.dll、.lib还有.exp文件了,这样隐式链接或者导入库引用都很方便。 接下来咱们说说怎么导出函数。这里有两种主流的做法只能挑一种来用。 第一种是用关键字的方法,直接在cpp文件里给函数加上_declspec(dllexport)修饰符。编译完之后在Debug目录就能得到标准格式的DLL了。这种写法简单明了就是函数名会被修饰得挺长的显式链接的时候得小心名称完全一致才行。 如果你想避免命名冲突可以在前面加个extern "C",这样编译器会按C语言规则处理函数名就不会被打乱了。 第二种是用DEF文件的方式导出。先把源文件里的_declspec(dllexport)删掉。然后在工程根目录下新建一个MyDll.def文件用记事本打开写: LIBRARY MyDll EXPORTS max min 注意这里的EXPORTS行只写函数名别加参数和类型格式错了会导致DLL生成失败。 把DEF文件加入到项目里再编译链接实测一下如果你没关联DEF文件的话生成出来的DLL就是个空壳子连Depends这种工具也看不出来有什么导出项。 对比一下你就会发现DEF方式导出的函数名干净得很显式链接的时候完全不用担心字符被截断或者混淆。 最后给个建议吧如果只是内部用的小模块函数也不多直接用_declspec(dllexport)就行了如果是要跨项目或者跨语言调用最好还是选DEF文件并且确保.def里的内容跟实际导出的函数一一对应为了避免冲突优先用extern "C"吧如果你非要用C++的特性就把修饰符写到类或者命名空间上别写在函数前面就好啦!