将资源构建为可重用的DLL,MFC/VC++

3
例如,我想要构建一个导出名为ShowDialog的函数的DLL,该函数显示对话框并更改其中一个对话框按钮的文本。应将对话框和所有其他资源捆绑在DLL中。
我进行了快速测试,当DLL尝试使用特定控件ID的GetDlgItem()时,它会得到一个空指针返回。我假设在这种情况下需要更多步骤来正确处理资源。
2个回答

4

你在DLL入口点是否做了以下类似的操作?

AFX_MANAGE_STATE(AfxGetStaticModuleState( ))

请查看关于MFC模块状态的技术说明。有各种类型的MFC模块状态,其中模块状态是您最常用的状态。

这将当前模块状态与从AfxGetStaticModuleState返回的状态交换,直到当前范围的结束。

如果不使用AFX_MODULE_STATE宏,则DLL中资源的问题将会发生。默认情况下,MFC使用主应用程序的资源句柄来加载资源模板。该模板实际上存储在DLL中。根本原因是MFC的模块状态信息没有通过AFX_MODULE_STATE宏进行切换。资源句柄是从MFC的模块状态中恢复的。不切换模块状态会导致使用错误的资源句柄。


谢谢。虽然这个回复提供了更多的信息,但我选择另一个作为正确答案,因为在 DLL 的入口点调用 AFX_MANAGE_STATE 并不能解决问题。 - sharkin
是的,它确实有。DLL 的入口点是外部代码可以调用到你的模块的任何地方。我猜你可能认为我指的是 DLLMain 或类似的地方。 - 1800 INFORMATION
是的,我做了,对于误解我很抱歉。 - sharkin

3

来自MSDN

默认情况下,MFC使用主应用程序的资源句柄来加载资源模板。如果您在DLL中有一个导出函数(例如,在DLL中启动对话框),则此模板实际上存储在DLL模块中。您需要切换模块状态以使用正确的句柄。您可以通过在函数开头添加以下代码来完成此操作:

AFX_MANAGE_STATE(AfxGetStaticModuleState());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接