一、孙鑫老师的讲解
资料:http://www.pconline.com.cn/pcedu/empolder/gj/vc/0607/820674.html
二、动态链接库的使用
1)静态使用
1在工程中加入静态库,有两种方法:
方法一:项目设置中引用.lib,project-setting-link-object/library modules中添加.lib;(需要在tools/options设置正确的引用路径)
方法二:在项目中直接加入lib,project-add to project-files,选择正确的.lib。
2在工程中包括.h文件;(可能 需要在tools/options设置正确的引用路径)
3在工程中使用静态库中的函数.
2)动态使用
三、MFC库支持的DLL
MFC库支持两种DLL:扩展DLL和正规的DLL。
扩展DLL动态链接到MFC库的DLL版本的代码,因此,扩展DLL要求客户程序被动态链接到MFC库,并且客户程序和扩展DLL要一致链接到MFCDLL的相同版本。扩展DLL可以导出整个类。
正规DLL可以被任何编程环境装载,应该使用正规DLL。正规DLL可以导出C风格的函数,不能导出C++类。但,我们可以再内部使用C++类(特别是MFC库的类)。正规DLL可以选择静态链接和动态链接两种方式。
扩展DLL需要注意的事情:
1.必须把宏AFX_EXT_CLASS加到导出类声明中,如:
class AFX_EXT_CLASS CStudnet :public CObject
对DLL工程中的H要修改,客户程序使用的H文件也一样要修改。
2.搜索顺序
EXE文件--扩展DLL--MFCDLL。如果资源ID在所有资源中式唯一的,MFC库将找到该资源。如果有重复的,将装入EXE资源。
搜索顺序的改变:
HINSTANCE hInstResourceClient = AfxGetResourceHandle();
AfxSetResourceHandle(::GetModuleHandle("mydllname.dll"));
CString strRes;
strRes.LoadString(IDS_MYSTRING);
AfxSetResourceHandle(hInstResourceClient);
扩展DLL使用:因为能导出整个类,所以可以直接使用。向使用自己的类一样。
正规DLL需要注意的事项:
1.使用AFX_MANAGE_STATE宏,如果使用静态链接可以不用。因为如果从一个正规MFC DLL中调用进入mfc42.dll,全局变量不同步,所以后果不可预知。需要在所有导出函数的开始处,加入
AFX_MANAGE_STATE(AfxGetStaticModuleState());
2.EXE资源函数装载自己的资源,DLL资源函数装载DLL自己的资源。exe想要装载DLL资源,可使用AfxGetResourceHandle进行改变。