从另一个 DLL 加载 MFC 应用程序对话框

Posted

技术标签:

【中文标题】从另一个 DLL 加载 MFC 应用程序对话框【英文标题】:MFC App loading dialog from another DLL 【发布时间】:2010-08-26 17:38:33 【问题描述】:

我们有一个非常大的 MFC 应用程序,解决方案中有 16 个项目。每个项目都是一个 DLL。其中四(4)个项目就是我们所说的“网络”。在每个网络中,都有一个我们将称为 X 的对话框。此对话框在每个网络中都非常不同,但对话框本身的名称在每个 resource.h 中都是相同的。在 resource.h 中,它们也具有相同的 ID(值)。

现在发生的事情是,当我在网络 1 上并使用对话框 X 加载类时,它会尝试使用来自网络 2 的对话框。由于它们没有所有相同的控制,它在 DoDataExchange 中尝试查找其他网络中不存在的控件时崩溃。

有人知道是什么原因造成的吗?尝试更改网络中不起作用的名称并没有改变任何东西,因为它使用了 ID...

我一直认为 DLL 使用的是它自己的 resource.h,但现在看来并非如此......

有人可以帮忙吗? 谢谢

【问题讨论】:

这篇文章好像是说,每个dll先看自己,再看其他地方……(support.microsoft.com/kb/150121/en-us)。是知道这个过程的顺序的一种方式吗? 【参考方案1】:

听起来您需要调用AfxSetResourceHandle 来指定要从中加载对话框的DLL。

编辑:根据您的描述,您基本上需要在显示对话框时每次使用正确的值调用它。更改诸如 DLL 加载顺序之类的东西并不能解决问题——在任何给定时间,MFC 都会尝试使用 one 顺序让 DLL/EXE 加载所有对话框,而这是模态的,所以它保持不变,直到你改变它。鉴于需要在不同时间引用不同资源的相同资源 ID,您需要在任何给定时间告诉它哪个资源 - 否则,您会得到它找到的第一个具有正确 ID 的东西,而几乎无法控制哪个会是。

【讨论】:

感谢您的回答。我试了一下,它可以工作......但就像 MSDN 说的:“加载应用程序资源的 .EXE 或 DLL 文件的实例或模块句柄。”这很糟糕,因为其他对话框可能使用除此之外的其他 dll,因此应用程序的其他部分无法工作...所有 dll 都已加载,我觉得这与加载顺序有关,但我找不到它在哪里…… 感谢您的回答。我最终在这篇文章中使用了解决方案:(codeguru.com/forum/archive/index.php/t-304181.html) 所以在析构函数中,我像以前一样放回了所有东西,效果很好。谢谢。

以上是关于从另一个 DLL 加载 MFC 应用程序对话框的主要内容,如果未能解决你的问题,请参考以下文章

将 UI 插入另一个 MFC 对话框

MFC如何调用DLL(VC++)

MFC DLL的GUI工具?

mfc 从另一个对话框更改对话框的光标

创建共享 MFC 对话框:常规 DLL 或 MFC 扩展 DLL

从应用程序对话框访问的 MFC 自定义键盘 DLL