内容是读这个博客的笔记,基本一样,但不记不踏实。作者写的很详细。
http://blog.csdn.net/rivershan/article/details/15789
分MFC DLL 和Win32 DLL
(一)
在Win32 DLL 中使用资源很简单,直接用。
DLL中:
extern "C" __declspec(dllexport) void ShowDlg()
{}
使用DLL:
extern “C” __declspec(dllexport )void ShowDlg();
#pragma comment(lib,"debug/UseDlg")
(二)
MFC DLL :
1. 静态链接到MFC Regular DLL using shared MFC DLL
DLL中:在 EXPORTS 语句加一行 ShowDlg
使用DLL:void ShowDlg();
#pargma comment(lib,"debug/DLLStatic")
2. 动态链接到MFC Regular DLL with MFC statically linked
使用时需要注意模块状态。
否则会调用到 主应用程序的资源。
用到函数和宏:
AFX_MODULE_STATIC * AFXAPI AfxGetStaticModuleStatic();
在堆栈构造AFX_MODULE_STATIC类实例,构造函数获取当前模块状态的指针并保存在成员中,
将pModuleStatic设置为新的有效模块状态。
析构函数将存储在成员中的前一个模块状态还原到当前模块。
AFX_MANAGE_STATE(AFX_MODULE_STATE * pModuleState)
将pModuleState设置为当前的 即时作用空间 中的有效状态模块,在离开该宏的作用空间时,自动还原到
上一个有效状态模块。
HINSTANCE AfxGetResourceHandle()
函数返回了一个保存了HINSTANCE类型的。应用程序默认所加载资源的模块的句柄。
void AfxSetResourceHandle(HINSTANCE hInstResource)
函数将hInstResource 所代表的模块设置为具有当前状态的模块。
使用方法1: 自动切换。
在 Regular DLL using shared MFC DLL工程中。
在ShowDlg 函数的第一条语句前加
AFX_MANAGE_STATIC(AfxGetStaticModuleState());确保是函数的第一句。
使用方法2:手动切换
函数最开始加
HINSTANCE save_hInstance = AfxGetResourceHandle();
AfxSetResourceHandle(theApp.m_hInstance);将DLL模块设置为当前状态。
(也可以调用GetModuleHandle函数获得DLL模块的句柄)
在调用对话框(资源)成功之后,也就是例子的dlg.DoModal()之后,
AfxSetResourceHandle(save_hInstance);
手动的好处:在完成使用资源的任务之后就可以立即恢复资源句柄。
而AFX_MANAGE_STATE(AfxGetStaticModuleState())方法只能等函数的作用空间结束之后才能恢复资源句柄。
由于可执行文件必须调用资源等原因,建议只要有可能就必须恢复资源句柄,否则可能会遇到许多问题。
比如,用户移动了主应用程序的对话框,而此时资源句柄仍然是DLL的资源句柄,程序就会崩溃。
最后的恢复方法就是在对话框响应WM_INITDIALOG消息的时候,因为这时候对话框的模板已经读出了。
3. 动态链接到MFC MFC extension DLL(using shared MFC DLL)
切换当前模块的方法与Regular DLL using shared MFC DLL的相似,不同如下:
使用 AFX_MANAGE_STATE(AfxGetStaticModuleState())产生如下错误:
mfcs42d.lib(dllmodul.obj) : error LNK2005: __pRawDllMain already defined in dllextend.obj
mfcs42d.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined in dllextend.obj
mfcs42d.lib(dllmodul.obj) : error LNK2005: __pRawDllMain already defined in dllextend.obj
要将AFX_MANAGE_STATE(AfxGetStaticModuleState())换成
AFX_MANAGE_STATIC(AfxGetAppModuleState())
手动方法一样。
并且 DLL模块的句柄可以通过MFC提供的DlgextentDLL结构的 hModule成员获取:
用法:AfxSetResourceHandle(DlgextentDLL.hModule);
对于动态链接到MFC的DLL,在调用该DLL的MFC应用程序中可以使用
AfxGetResourceHandle 和AfxSetResourceHandle函数切换当前模块状态,DLL模块的句柄可以通过
GetModuleHandle函数获得。