项目开发都是分模块的,所以常常需要些个动态库方便别人调用。这两天因为项目集成,因为是组长负责集成我只需要跟进就可以,模块有问题需要及时调整的。所以上班的时候有零碎的时间。就看看公司的一些代码,然后有感而发,就把动多态库的知识看了一下。下面是一些心得(都是从一个文章摘抄的一些东西,pdf我会上传的):
1.,静态调用方式的顺利进行需要完成两个动作
(1)告诉编译器与 DLL 相对应的.lib 文件所在的路径及文件名,#pragmacomment(lib,"dllTest.lib")就是起这个作用。
程序员在建立一个 DLL 文件时,连接器会自动为其生成一个对应的.lib 文件,
该文件包含了 DLL 导出函数的符号名及序号(并不含有实际的代码)。在应用程序里,.lib 文件将作为 DLL 的替代文件参与编译。
2)声明导入函数,extern "C" __declspec(dllimport) add(int x,inty)语句中的__declspec(dllimport)发挥这个作用。
2.DllMain函数
2.1.Windows 在加载 DLL 的时候,需要一个入口函数;DLL 如没
有提供 DllMain 函数,应用工程也能成功引用 DLL,这是因为 Windows 在找不到
DllMain 的时候,系统会从其它运行库中引入一个不做任何操作的缺省 DllMain
函数版本
2.2 Windows 必须查找并执行 DLL 里的 DllMain 函数作为加载
DLL 的依据,它使得 DLL 得以保留在内存里。这个函数并不属于导出函数,而是
DLL 的内部函数。这意味着不能直接在应用工程中引用 DllMain 函数,DllMain
是自动被调用的。
3.MFC DLL使用:
3.1 Regular DLL 分为两类
(1)静态链接到 MFC 的规则 DLL
静态链接到 MFC 的规则 DLL 与 MFC 库(包括 MFC 扩展 DLL)静态链接,将
MFC 库的代码直接生成在.dll 文件中。在调用这种 DLL 的接口时,MFC 使用 DLL
的资源。因此,在静态链接到 MFC 的规则 DLL 中不需要进行模块状态的切换。
使用这种方法生成的规则 DLL 其程序较大,也可能包含重复的代码。
(2)动态链接到 MFC 的规则 DLL
动态链接到 MFC 的规则 DLL 可以和使用它的可执行文件同时动态链接到
MFC DLL 和任何 MFC 扩展 DLL。在使用了 MFC 共享库的时候,默认情况下,MFC
使用主应用程序的资源句柄来加载资源模板。这样,当 DLL 和应用程序中存在相
同 ID 的资源时(即所谓的资源重复问题),系统可能不能获得正确的资源。因
此,对于共享 MFC DLL 的规则 DLL,我们必须进行模块切换以使得 MFC 能够找到
正确的资源模板。
3.2 共享 MFC DLL 的规则 DLL 的模块切换
(1)应用程序进程本身及其调用的每个 DLL 模块都具有一个全局唯一的
HINSTANCE 句柄,它们代表了 DLL 或 EXE 模块在进程虚拟空间中的起始地址。进
程本身的模块句柄一般为 0x400000,而 DLL 模块的缺省句柄为 0x10000000
(2)共享 MFC DLL(或 MFC 扩展 DLL)的规则 DLL 涉及到 HINSTANCE 句柄问题,
HINSTANCE 句柄对于加载资源特别重要。EXE 和 DLL 都有其自己的资源,而且这
些资源的 ID 可能重复,应用程序需要通过资源模块的切换来找到正确的资源
(3)资源模块句柄的切换,其实现方法有三:
方法一在 DLL 接口函数中使用:
AFX_MANAGE_STATE(AfxGetStaticModuleState());
方法二在 DLL 接口函数中使用:
AfxGetResourceHandle 用于获取当前资源模块句柄,而
AfxSetResourceHandle 则用于设置程序目前要使用的资源模块句柄。
方法三 由应用程序自身切换
资源模块的切换除了可以由 DLL 接口函数完成以外,由应用程序自身也能
完成
文章所有的东西都是来自《VC++动态链接库(DLL)》,我希望看到这个帖子的人如果有需要的话可以看看这个数,比较详细,文章也不长。