WEB开发网
开发学院软件开发VC VC++动态链接库(DLL)编程深入浅出(三) 阅读

VC++动态链接库(DLL)编程深入浅出(三)

 2007-03-15 21:47:45 来源:WEB开发网   
核心提示: 图14 EXE中的对话框图13和图14中的对话框除了caption不同(以示区别)以外,其它的都相同,VC++动态链接库(DLL)编程深入浅出(三)(7),尤其值得特别注意,在DLL和EXE中我们对图13和图14的对话框使用了相同的资源ID=2000,在函数结束时恢复//将AFX_MANA

图14 EXE中的对话框

图13和图14中的对话框除了caption不同(以示区别)以外,其它的都相同。

尤其值得特别注意,在DLL和EXE中我们对图13和图14的对话框使用了相同的资源ID=2000,在DLL和EXE工程的resource.h中分别有如下的宏:

//DLL中对话框的ID
#define IDD_DLL_DIALOG 2000
//EXE中对话框的ID
#define IDD_EXE_DIALOG 2000

与5.3节静态链接MFC DLL的规则DLL相同,我们还是在规则DLL中定义接口函数ShowDlg,原型如下:

#include "StdAfx.h"
#include "SharedDll.h"
void ShowDlg(void)
{
CDialog dlg(IDD_DLL_DIALOG); //打开ID为2000的对话框
dlg.DoModal();
}

而为应用工程主对话框的“调用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的对话框!嘿嘿,弹出了正确的对话框资源。

上一页  2 3 4 5 6 7 8 9 10  下一页

Tags:VC 动态 链接

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接