dll中如何得到一个对话框的句柄 - VC/MFC / 基础类

来源:百度文库 编辑:神马文学网 时间:2024/04/29 05:20:34
从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,而且总能得
到正确的结果,我希望它能对你有所帮助。
dll中如何得到一个对话框的句柄 - VC/MFC / 基础类 如何在程序执行比较长时间的处理时弹出一个等待对话框 VC/MFC / 基础类 vc中如何调用webservice? VC/MFC / 进程/线程/DLL 一步一步实现MFC扩展DLL中导出类和对话框 如何让基于对话框的MFC程序启动后自动隐藏对话框 VC/MFC / 界面 2如何让基于对话框的MFC程序启动后自动隐藏对话框 VC/MFC / 界面 - 社区 community.csdn.net vc中如何调用webservice? VC/MFC / 进程/线程/DLL - CSDN社... 如何将CString转换为char[] VC/MFC / 基础类 如何改变Windows开机时登陆的验证机制 VC/MFC / 基础类 VC中, 为何每次都要重新编译? VC/MFC / 基础类 - CSDN社区 commu... vc中listbox控件为什么不能横滚动 VC/MFC / 基础类 - CSDN社区 co... 在ADO中如何获得一个表中记录的总数? VC/MFC / 数据库 - CSDN社区 com... 求助:软件加密方式! - VC/MFC / 基础类 如何改变Windows开机时登陆的验证机制 VC/MFC / 基础类 - CSDN社区 community.csdn.net MFC中基于对话框程序快捷键的实现 MFC中基于对话框程序快捷键的实现 VC++中MFC窗口对象的清除 VC知识库文章 - MFC程序员的WTL指南: Part IV - 对话框与控件 【原创&交流】PE文件格式的一些研究 - VC/MFC / 基础类 使用MFC DLL基础教程基础实例 vc中更改对话框大小 如何让基于对话框的MFC程序启动后自动隐藏对话框--==>肯肯编程小屋<== 编译成release版本与debug版本的程序有何执行上的区别? VC/MFC / 基础类... VC DLL导出类