例如,我想要构建一个导出名为ShowDialog的函数的DLL,该函数显示对话框并更改其中一个对话框按钮的文本。应将对话框和所有其他资源捆绑在DLL中。
我进行了快速测试,当DLL尝试使用特定控件ID的GetDlgItem()时,它会得到一个空指针返回。我假设在这种情况下需要更多步骤来正确处理资源。
我进行了快速测试,当DLL尝试使用特定控件ID的GetDlgItem()时,它会得到一个空指针返回。我假设在这种情况下需要更多步骤来正确处理资源。
你在DLL入口点是否做了以下类似的操作?
AFX_MANAGE_STATE(AfxGetStaticModuleState( ))
请查看关于MFC模块状态的技术说明。有各种类型的MFC模块状态,其中模块状态是您最常用的状态。
这将当前模块状态与从AfxGetStaticModuleState返回的状态交换,直到当前范围的结束。
如果不使用AFX_MODULE_STATE宏,则DLL中资源的问题将会发生。默认情况下,MFC使用主应用程序的资源句柄来加载资源模板。该模板实际上存储在DLL中。根本原因是MFC的模块状态信息没有通过AFX_MODULE_STATE宏进行切换。资源句柄是从MFC的模块状态中恢复的。不切换模块状态会导致使用错误的资源句柄。
来自MSDN:
默认情况下,MFC使用主应用程序的资源句柄来加载资源模板。如果您在DLL中有一个导出函数(例如,在DLL中启动对话框),则此模板实际上存储在DLL模块中。您需要切换模块状态以使用正确的句柄。您可以通过在函数开头添加以下代码来完成此操作:
AFX_MANAGE_STATE(AfxGetStaticModuleState());