次の構成を作成しました。
- A)2つのMFCダイアログを持つMFC拡張DLL。
- B)DLLA関数を使用するMFC通常のdll。
- C)DLL Bから関数を呼び出すwin32アプリケーション(非MFC)
DLL Aから関数を呼び出してダイアログを表示するDLLBから関数を呼び出すと、リソースが見つからないためにエラーが発生します。
私は正確な根本原因を見つけるために掘り下げました、そして主な理由はモジュールコンテキストがダイアログリソースを含むDLLAではなく呼び出し元のdllBに設定されているという事実であるようです。
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;
}
私が見つけた回避策の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);
}
この回避策を使用することにより、アサーションが発生しますが、ダイアログが表示されます。
この問題を解決する通常の方法は何でしょうか?