文档详情

Windows动态链接库创建使用总结.docx

发布:2017-04-24约2.34千字共6页下载文档
文本预览下载声明
Windows动态链接库创建使用总结 目录  TOC \o 1-3 \h \z \u  HYPERLINK \l _Toc358461238 1 动态链接库创建方式  PAGEREF _Toc358461238 \h 1  HYPERLINK \l _Toc358461239 2 设置动态库导出方式  PAGEREF _Toc358461239 \h 2  HYPERLINK \l _Toc358461240 2.1头文件中声明导出  PAGEREF _Toc358461240 \h 2  HYPERLINK \l _Toc358461241 2.0 .def文件方式定义导出  PAGEREF _Toc358461241 \h 3  HYPERLINK \l _Toc358461242 3 动态链接库加载方式  PAGEREF _Toc358461242 \h 5  HYPERLINK \l _Toc358461243 3.1 隐式链接方式加载DLL  PAGEREF _Toc358461243 \h 5  HYPERLINK \l _Toc358461244 3.2 显示加载DLL  PAGEREF _Toc358461244 \h 5  HYPERLINK \l _Toc358461245 3.3 两种方式的对比  PAGEREF _Toc358461245 \h 6  HYPERLINK \l _Toc358461246 4 注意事项  PAGEREF _Toc358461246 \h 6  1 动态链接库创建方式 2 设置动态库导出方式 2.1头文件中声明导出 (1)在动态库工程的头文件中定义导入导出方式如下: 其中DLLTEST_EXPORTS是定义WIN32动态库后自动生成预处理命令,所以宏定义DLLTEST_EXPORT都将是导出的形式。另外注意预处理命令一般放在头文件的前面。 (2)如果需要定义全局的导出函数,在头文件中应该声明如下: 其中extern C是解决C++和C语言间互相调用时函数命名的问题。但是其只能用于全局函数的声明,不能用于类成员函数的声明。 (3)如果定义导出类,在头文件中应该声明如下: (4)需要特别注意的是,如果一个全局函数或者一个类中的所有函数都在头文件中实现了,哪么这个函数或者类可以不声明为导出类,也可以在动态库外使用,只要包含头文件就可以了。 2.0 .def文件方式定义导出 (1)第一种添加.def文件的方式,File -New -Text File -名称中直接填入DllTest2.def,切记一定要有.def后缀。 (2)第二种添加.def文件的方式,在工程文件夹下新建一个txt文档,然后将文档类型修改为.def文档类型,然后将该.def文件加入到工程中。有一点需要特别提醒,不能隐藏已知文件类型的扩展名,否则无法修改文件类型。 (3)当定义添加了.def文件后,就需要在.def文件中添加导出接口。 LIBRARY:指定动态连接库的内部名称,该名称必须与生成的动态链接库的名称一致。 DESCRIPTION:描述信息,可省略 EXPORTS:声明导出接口 (4)使用.def文件的优点是解决了不同的编译方式的名字改编问题,所有导出函数都是用.def中定义的名字。其中带出类成员函数的方式与全局函数的方式一致。但是有一个缺点,.def导出的函数标示符必须在整个动态库中是唯一的。 3 动态链接库加载方式 3.1 隐式链接方式加载DLL (1)客户端程序不仅需要.dll动态库文件,还需要导出函数声明的头文件和引入库文件。 (2)引入库文件工程设置如下:需要加入生成的引入库文件以及文件所在的路径。 3.2 显示加载DLL (1)显示方式加载DLL不需要包含导出接口的头文件,也不需要在工程设置对话框的Link选项中添加对lib文件的链接。 (2)显示加载方式需要调用一些Windows的接口。 (3)typedef int (*ADDPROC) (int a,int b);程序中函数指针的定义,必须和导出函数定义一致,其中包括调用的约定。 (4)ADDPROC Add = (ADDPROC)GetProcAddress(hInst,Add);如果发生了名字改编,客户端调用时候需要的名字也必须是改编后的名字。 3.3 两种方式的对比 (1)采用动态加载方式,优点是可以在需要时才加载DLL,节约资源;缺点是需要自己手动加入,增加代码编写量,而且如果存在调用方式和名字改编,程序更容易出错。 (2)采用隐式链接方式,优点是实现起来比较简单,在编写客户端代码时就可以把链接工作做好
显示全部
相似文档