分为两类:
(1)静态链接到MFC的规则DLL
静态链接到MFC的规则DLL与MFC库静态链接,将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能够找到正确的资源模块。
我们可以在project->setting->General中设置MFC规则DLL是静态链接到MFC DLL还是动态链接到MFC DLL。
如果在所调用的DLL函数中使用了资源,则需要采用静态链接的方式,才能正确调用DLL函数;如果要采用动态链接,需要进行模块切换,模块切换的方法稍后即讲。
如果所调用的DLL函数没有使用任何资源,则即使采用动态链接的方式,也不需要进行模块切换,和使用Win32 DLL一样。
模块切换的方法:
(1)在DLL接口函数中使用:
AFX_MANAGE_STAGE(AfxGetStaticModuleStatic());
即在接口函数入口处加上该语句进行模块状态切换。
(2)在DLL接口函数中使用:
AfxGetResourceHandle();
AfxSetResourceHandle(HINSTANCE xxx);
如下列代码:
void ShowDlg(void)
{
HINSTANCE save_hInstance=AfxGetResourceHandle();
AfxSetResourceHandle(theApp.m_hInstance);
CDialog dlg(IDD_DLL_DIALOG);
dlg.DoModal;
AfxSetResourceHandle(save_hInstance);
}
(3)由调用DLL的应用程序自身切换
资源模块的切换除了可以由DLL接口函数完成以外,由应用程序自身也能完成。
//获取exe模块句柄
HINSTANCE exe_hInstance = GetModuleHandle(NULL);
//或者HINSTANCE exe_hInstance = AfxGetResourceHandle();
//获取DLL模块句柄
HINSTANCE dll_hInstance = GetModuleHandle("SharedDll.dll");
//切换状态
AfxSetResourceHandle(dll_hInstance);
//调用DLL函数
ShowDlg();
//资源模块恢复
AfxSetResourceHandle(exe_hInstance);