VS2008ウィザードを使用してMFCAppを作成しました。私のアプリケーションの "InitInstance()"では、いくつかのdllファイルをロードする必要があるので、 "LoadLibraryA()"メソッドを呼び出しています。しかし、私は "LoadLibraryA()"と呼ばれるとすぐに、私のアプリケーションの "InitInstance()"を呼び出すので、無限の再帰的なものになります。私が間違っていることはありますか?MFC APPで、 "InitLstA"から "LoadLibraryA"を呼び出すと、何度も "InitInstance"が呼び出されます。
// CLoader_MFCApp initialization
BOOL CLoader_MFCApp::InitInstance()
{
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);
CWinAppEx::InitInstance();
SetRegistryKey(_T("MyApp"));
HMODULE hm = LoadLibraryA("./abc/def.dll");
// after above line InitInstance() gets called again
// more code
return FALSE;
}
コールスタック:
MyApp.exe!CLoader_MFCApp::InitInstance() C++
CORE.dll!InternalDllMain(HINSTANCE__ *, unsigned long, void *) C++
CORE.dll!__DllMainCRTStartup(void *, unsigned long, void *) C
CORE.dll!_DllMainCRTStartup(void *, unsigned long, void *) C
[email protected]()
[email protected]()
[email protected]()
[email protected]()
[email protected]()
[email protected]()
[email protected]()
MyApp.exe!CLoader_MFCApp::InitInstance() C++
mfc90.dll!AfxWinMain(HINSTANCE__ *, HINSTANCE__ *, char *, int) C++
MyApp.exe!__tmainCRTStartup() C
kernel32.dll!_BaseP[email protected]()
"Def.dllは" のMyAppから他のDLLとは全く無関係です。この場合、別のdll "CORE.dll"をロードしようとしています。
私が知ることができるのは、InitInstanceルーチンが終了する前にLoadLibraryを呼び出していることです。 InitInstanceの後に呼び出される他の(オーバーライド可能な)メソッドはありますか?もしそうなら、私はそのメソッドにLoadLibrary呼び出しを移動することができます...
(可能ならば、またDLLの)デバッグビルドを使用して、あなたがLoadLibraryの後のInitInstanceを再入力する際にコールスタックを投稿してください。 – peterchen
./abc/def.dllとは何ですか。どのようなものが読み込まれていますか?ライブラリ(循環依存性)を読み込もうとしていますか? – CashCow
"CLoader_MFCApp"とこの "def.dll"の間の関係は何ですか? – patriiice