我已经构建了以下配置:
- A) 具有 2 个 MFC 对话框的 MFC 扩展 DLL。
- B) 使用 DLL A 函数的 MFC 常规 dll。
- C) win32 应用程序 (NON MFC) 从 DLL B 调用函数
当调用 DLL B 的函数时,内部调用 DLL A 的函数以显示对话框,由于无法找到资源而发生错误。
我已深入挖掘以找到确切的根本原因,主要的原因似乎是模块上下文设置为调用 dll B 而不是 DLL A,后者包含对话框资源。
在 DllMain 内部,初始化按照 MSDN 中的描述完成:
static AFX_EXTENSION_MODULE NEAR extensionDLL = { NULL, NULL };
extern "C" int APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
Hinstance = hInstance; //save instance for later reuse
// Extension DLL one-time initialization
if (AfxInitExtensionModule(extensionDLL,hInstance) == 0)
{
AfxMessageBox("Error on init AfxInitExtensionModule!");
return 0;
}
// Insert this DLL into the resource chain
new CDynLinkLibrary(extensionDLL);
}
else if (dwReason == DLL_PROCESS_DETACH)
{
Release();
}
return 1;
}
我发现的一个解决方法是存储从 DLLMain 接收的 hInstance 参数:extern "C"int APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason , LPVOID lpReserved) 在 DLL A 中调用函数时,我保存当前句柄并将新句柄设置为从 DllMain 收到的句柄:
DLL A function1(............)
{
HINSTANCE HinstanceOld = AfxGetResourceHandle();
AfxSetResourceHandle(CErrohInstance);
.......
//display dialog
.....
AfxSetResourceHandle(HinstanceOld);
}
通过使用这个 workarround 它仍然会导致断言,但会显示对话框。
解决这个问题的正常方法应该是什么?
最佳答案
您必须将扩展 DLL 的资源插入到常规 DLL 的资源链中,而不是 EXE。只需在扩展 DLL 中创建一个函数并在常规 DLL 的 InitInstance 方法中调用它,如下所示:
void initDLL()
{
new CDynLinkLibrary(extensionDLL);
}
关于c++ - MFC扩展dll资源加载问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11517439/