例如,我想构建一个DLL,导出一个名为ShowDialog的函数,该函数显示一个对话框并更改其中一个对话框按钮中的文本。对话框和所有其他资源应该捆绑在DLL中。
我做了一个快速测试,当DLL尝试使用某个控件ID的GetDlgItem()时,它会返回一个空指针。我假设在这种情况下需要更多步骤来正确处理资源。
答案 0 :(得分:4)
您是否在DLL的入口点执行以下操作?
AFX_MANAGE_STATE(AfxGetStaticModuleState( ))
检查technote here about MFC module state。有各种类型的MFC模块状态,模块状态是您最常与之交互的状态。
交换当前模块状态 与国家返回 AfxGetStaticModuleState直到结束 目前的范围。
DLL中的资源问题会 如果AFX_MODULE_STATE宏是,则会发生 不曾用过。默认情况下,MFC使用 主要的资源处理 应用程序加载资源 模板。实际上这个模板 存储在DLL中。根本原因是 那个MFC的模块状态信息 没有被切换过 AFX_MODULE_STATE宏。资源 句柄从MFC的模块中恢复 州。不切换模块状态 导致错误的资源句柄 使用
答案 1 :(得分:3)
来自MSDN:
默认情况下,MFC使用该资源 主要应用程序的句柄加载 资源模板。如果你有 在DLL中导出函数,例如 一个启动对话框的人 DLL,这个模板实际上是存储的 在DLL模块中。你需要切换 模块状态为正确 要使用的句柄。你可以这样做 将以下代码添加到 功能的开头:
AFX_MANAGE_STATE(AfxGetStaticModuleState());