VS2012中 C++创建DLL图解
参考文章:http://hi.baidu.com/lipeiyi2006/item/df1d035734472d9509be17c0
注:由于网上关于此篇文章出处太多,自己也搞不清楚到底原作者是出自谁,在此就不做深究了,自己对于原作者表示深深的感谢!
本文主要是参考了“VS2010中 C++创建DLL图解”这篇文章,在此基础上本人总结了自己在VS2012中具体实现时遇到的问题和相应的解决方法。
0、
Windows API中所有的函数都包含在dll中,其中有3个最重要的DLL。
(1) Kernel32.dll
它包含那些用于管理内存、进程和线程的函数,例如CreateThread函数;
(2) User32.dll
它包含那些用于执行用户界面任务(如窗口的创建和消息的传送)的函数,例如CreateWindow函数;
(3) GDI32.dll
它包含那些用于画图和显示文本的函数。
静态库和动态库
(1) 静态库
函数和数据被编译进一个二进制文件(通常扩展名为.LIB)。在使用静态库的情况下,在编译链接可执行文件时,链接器从库中复制这些函数和数据并把它们和应用程序的其他模块组合起来创建最终的可执行文件(.Exe文件).当发布产品时,只需要发布这个可执行文件,并不需要发布被使用的静态库。
(2) 动态库
在使用动态库的时候,往往提供两个文件:一个引入库(.lib)文件和一个DLL(.dll)文件。虽然引入库的后缀名也是”lib”,但是动态库的引入库文件和静态库文件有着本质上的区别,对一个DLL来说,其引入库文件(.lib)包含该DLL导出的函数和变量的符号名,而.dll文件包含该DLL实际的函数和数据。在使用动态库的情况下,在编译链接可执行文件时,只需要链接该DLL的引入库文件,该DLL中的函数代码和数据并不复制到可执行文件中,直到可执行程序运行时,才去加载所需的DLL,将该DLL映射到进程的地址空间外,然后访问DLL中导出的函数。这时,发布产品时,除了发布可执行文件以外,同时还要发布该程序将要调用的动态链接库。
一、DLL的创建
创建项目: Win32->Win32项目,名称:MyDLL
选择DLL (D) ->完成.
1、新建头文件testdll.h
testdll.h代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
Ps:__declspec(dllexport)的作用,它就是为了省掉在DEF文件中手工定义导出哪些函数的一个方法。当然,如果你的DLL里全是C++的类的话,你无法在DEF里指定导出的函数,只能用__declspec(dllexport)导出类。
*注:extern "C"是可选的,