2010年11月11日星期四

应用程序与MFC规则DLL共享MFC DLL(或MFC扩展DLL)资源模块句柄的切换

产生这个问题的根源在于应用程序与MFC规则DLL共享MFC DLL(或MFC扩展DLL)的程序总是默认使用EXE的资源,我们必须进行资源模块句柄的切换,其实现方法有三:

方法一 DLL接口函数中使用:

AFX_MANAGE_STATE(AfxGetStaticModuleState());

我们将DLL中的接口函数ShowDlg改为:

void ShowDlg(void)

{

//方法1:在函数开始处变更,在函数结束时恢复

//AFX_MANAGE_STATE(AfxGetStaticModuleState());作为接口函数的第一//条语句进行模块状态切换

AFX_MANAGE_STATE(AfxGetStaticModuleState());

CDialog dlg(IDD_DLL_DIALOG);//打开ID2000的对话框

dlg.DoModal();

}

这次我们再点击EXE程序中的"调用DLL"按钮,弹出的是DLL中的如图13的对话框!嘿嘿,弹出了正确的对话框资源。

AfxGetStaticModuleState是一个函数,其原型为:

AFX_MODULE_STATE* AFXAPI AfxGetStaticModuleState( );

该函数的功能是在栈上(这意味着其作用域是局部的)创建一个AFX_MODULE_STATE类(模块全局数据也就是模块状态)的实例,对其进行设置,并将其指针pModuleState返回。

AFX_MODULE_STATE类的原型如下:

// AFX_MODULE_STATE (global data for a module)

class AFX_MODULE_STATE : public CNoTrackObject

{

public:

#ifdef _AFXDLL

AFX_MODULE_STATE(BOOL bDLL, WNDPROC pfnAfxWndProc, DWORD dwVersion);

AFX_MODULE_STATE(BOOL bDLL, WNDPROC pfnAfxWndProc, DWORD dwVersion,BOOL bSystem);

#else

AFX_MODULE_STATE(BOOL bDLL);

没有评论:

发表评论

欢迎访问、交流!对本博客有何建议,请
来信告知!
本博内容来源于网络,如有不当或侵犯权益,请来信告知,将及时撤除!
如引用博客内容、论文,请注明原作者!

Google一下本博客