我已经构建了以下配置:
- 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 它仍然会引起断言,但会显示对话框。
解决这个问题的正常方法应该是什么?