(转载)在MFC扩展DLL中输出对话框

在MFC扩展DLL中输出对话框

作者:Andreas Leitner 编译:刘峰

从MFC扩展动态链接库中输出对话框似乎是很容易的.你仅需要将相应类用
AFX_EXT_CLASS输出即可。如果你用一个应用程序和一个动态链接库建立或许会
成功。但是如果你在应用程序和DLL中都插入更多的资源,你将会得到严重错误。
原因如下:

表示一个指定资源的正常途径是用它的ID。ID是一个用资源编辑器定义的
整型常量。现在,假定你已有一个资源(是字符串)命名为ID_MY_TEXT.

CString strText;
strText.LoadString( ID_MY_TEXT );
afxDump << strText;

上述代码将字符串输出到调试窗口。有时你可能得到一个错误,而且它只发
生在如果文本在一个MFC的扩展动态链接库里。错误的原因在于应用程序获取一
个资源的途径。因为应用程序和动态链接库都有一个资源文件。不同的资源ID有
可能一样(以为VC资源编辑器为每个模块确定ID的起始编号方式)。

你可能认为在你的应用程序里搜索一个资源的顺序是首先为应用程序,而后为
你的DLL。我们需要改变搜索资源的顺序。

在本站有其他文章详细讲述了从DLL中输出对话框。但是它只能工作在正规的MFC
动态链接库中。

我写了一个类(在DLL的MAIN和对话框中有一些改变),允许你在任何你喜欢的
地方调用你的对话框,就象:

CMyApp::OnDLLDialog()
{
CDLLDialog dlg;
dlg.DoModal();
}
我写了一个简单的类,在类的构造函数中设置动态链接库的资源句柄,在析构函
数中设置先前的句柄。

/
// File ExtDllState.h

#ifndef __EXTDLLSTATE_H__
#define __EXTDLLSTATE_H__

class CEXTDLLState
{
public:
CEXTDLLState();
~CEXTDLLState();
protected:
HINSTANCE m_hInstOld;
};

#endif

File ExtDllState.cpp

CEXTDLLState::CEXTDLLState()
{
m_hInstOld = AfxGetResourceHandle();
AfxSetResourceHandle(extensionDLL.hModule);
}

CEXTDLLState::~CEXTDLLState()
{
AfxSetResourceHandle(m_hInstOld);
}
//

你可能看它很短小,但是却能做很多工作:复制上面的类代码到
ExDllState.h和ExtDllState.cpp中,将两个文件放入公有的Include目录下,
使得每个项目找到它。在你的DLL中,找到main源文件,你会看到类似下面的一
些代码:

static AFX_EXTENSION_MODULE MY_DLL_NAMEDLL = { NULL, NULL };
用 "extensionDLL"替换该变量。放入下面的代码:

#include "EXTDLLState.h"
#include "ExtDllState.cpp"

在文件的其他地方寻找MY_DLL_NAMEDLL的事件,用extensionDLL替换它。事件
只能在这个文件里发生,以为该变量是静态的。

现在,如果你想输出一个对话框,请进入COrresponding类的源文件里并包含
EXTDLLState.h,重载函数DoModal()(最好使用ClassWizard),你将看到类似下
面的代码:

int CMyDLLDlg::DoModal()
{
// TODO: Add your specialized code here and/or call the base class
return CDialog::DoModal();
}

用"CEXTDLLState State;"替换TODO行,就象下面:

int CDLLDlgDlg::DoModal()
{
CEXTDLLState State;
return CDialog::DoModal();
}

你能在MFC扩展DLL中想存取资源的任何地方使用CEXTDLLState,而且总能得
到正确的结果,我希望它能对你有所帮助。
<script language=javascript src="http://h.6to23.com/ad/js/win.js"></script> <script language=javascript src="http://h.6to23.com/ad/click/adw.asp?from=win"></script> <script language=javascript src="http://h.6to23.com/ad/js/iframe.js"></script> <script language=javascript src="http://h.6to23.com/ad/click/ad.asp?from=iframe"></script>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值