我已经建立了以下配置:
我已经挖掘出确切的根本原因,主要原因似乎是模块上下文设置为调用DLL B而不是包含对话框资源的DLL A。
在DllMain中,初始化如MSDN所述:
- A) MFC扩展DLL,包含2个MFC对话框。
- B) 使用DLL A函数的MFC常规dll。
- C) 非MFC的win32应用程序调用来自DLL B的函数
我已经挖掘出确切的根本原因,主要原因似乎是模块上下文设置为调用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);
}
通过使用这个解决方法,虽然仍会导致断言,但对话框已经显示出来了。
那么,应该采用何种正常的方式来解决这个问题呢?