龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

VC++动态链接库(DLL)编程深入浅出(三)[组图](9)

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
而为应用工程主对话框的“调用DLL”的单击事件添加如下消息处理函数: void CSharedDllCallDlg::OnCalldllButton() { ShowDlg(); } 我们以为单击“调用DLL”会弹出如图

  而为应用工程主对话框的“调用DLL”的单击事件添加如下消息处理函数:

void CSharedDllCallDlg::OnCalldllButton()

{

ShowDlg();

}

  我们以为单击“调用DLL”会弹出如图13所示DLL中的对话框,可是可怕的事情发生了,我们看到是图14所示EXE中的对话框!

  惊讶?

  产生这个问题的根源在于应用程序与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);//打开ID为2000的对话框

dlg.DoModal();

}

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

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

AFX_MODULE_STATE* AFXAPI AfxGetStaticModuleState( );

精彩图集

赞助商链接