工控编程吧

标题: 上位机MFC如何在DLL中使用对话框资源 [打印本页]

作者: qq263946146    时间: 2019-8-10 15:54
标题: 上位机MFC如何在DLL中使用对话框资源
这里最关键的一点就是必须在动态库里调用与显示对话框资源时,
调用代码        AFX_MANAGE_STATE(AfxGetStaticModuleState());
具体原理,我们可以借用网络上的一段解释:
应用程序进程本身及其调用的每个DLL模块都具有一个全局唯一的HINSTANCE句柄,
它们代表了DLL或EXE模块在进程虚拟空间中的起始地址。
进程本身的模块句柄一般为0x400000,而DLL模块的缺省句柄为0x10000000。
如果程序同时加载了多个DLL,则每个DLL模块都会有不同的 HINSTANCE。应用程序在加载DLL时对其进行了重定位。
  共享MFC DLL(或MFC扩展DLL)的规则DLL涉及到HINSTANCE句柄问题,HINSTANCE句柄对于加载资源特别重要。
EXE和DLL都有其自己的资源,而且这些资源的ID可能重复,应用程序需要通过资源模块的切换来找到正确的资源。
如果应用程序需要来自于DLL的资源,就应将资源模块句柄指定为 DLL的模块句柄;
如果需要EXE文件中包含的资源,就应将资源模块句柄指定为EXE的模块句柄。
模块的切换有三种方式,最简单一的种如下:
在DLL函数中调用:AFX_MANAGE_STATE(AfxGetStaticModuleState());
例如
void ShowDlg(void)
{
//在函数开始处变更,在函数结束时恢复,将AFX_MANAGE_STATE(AfxGetStaticModuleState());作为接口函数的第一条语句进行模块状态切换
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CDialog dlg(IDD_DLL_DIALOG);//此ID为动态中创建的对话框ID。
dlg.DoModal();
}

所以我们可以在动态库工程中像正常工程一样创建界面处理类,再调用上面的函数进行模块状态切换。

在外部程序调用 动态库就变得 简单了。
#include "Test.h"
#pragma comment(lib,"Test.lib")
void ShowDialog();
void CMy456Dlg::OnButton1()
{
ShowDialog();
}

提供源代码例程下载:
(, 下载次数: 0)