【发布时间】:2012-07-16 01:49:07
【问题描述】:
我已经构建了以下配置:
- 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,它仍然会引起断言,但会显示对话框。
解决这个问题的正常方法应该是什么?
【问题讨论】: