2009-02-10 105 views
3

例如,我想构建一个导出名为ShowDialog的函数的DLL,该函数显示一个对话框并更改其中一个对话框按钮中的文本。对话框和所有其他资源应该捆绑在DLL中。将资源建立到DLL中以供重用,MFC/VC++

我做了一个快速测试,当DLL尝试GetDlgItem()与一个特定的控制ID,它得到一个空指针回来。我假设在这种情况下需要更多的步骤才能正确处理资源。

回答

3

MSDN

默认情况下,MFC使用主应用程序的资源 手柄装入 资源模板。如果在DLL中有导出的函数 ,例如 ,那么在 DLL中启动一个对话框,该模板实际上被存储在DLL模块中的 。您需要切换 模块状态,以获取要使用的正确的 手柄。您可以通过 这样做将以下代码添加到 开始的功能:

AFX_MANAGE_STATE(AfxGetStaticModuleState()); 
4

你做这样的事情在入口点到你的DLL以下?

AFX_MANAGE_STATE(AfxGetStaticModuleState()) 

检查此technote here about MFC module state。有各种类型的MFC模块状态,模块状态是您最常用的一种。

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

如果AFX_MODULE_STATE宏未使用 ,则DLL中资源的问题将发生 。默认情况下,MFC使用 主应用程序的 资源句柄加载资源 模板。这个模板实际上是 存储在DLL中。根本原因是 MFC的模块状态信息 尚未被 AFX_MODULE_STATE宏切换。资源 句柄从MFC的模块 状态恢复。未切换模块状态 导致使用错误的资源句柄为 。

+0

谢谢。即使这个回复包含更多信息,我选择了另一个作为正确答案,因为在DLL的入口点调用AFX_MANAGE_STATE并不能解决问题。 – sharkin 2009-02-14 16:27:41