2011-01-06 24 views
3

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呼び出しを移動することができます...

+1

(可能ならば、またDLLの)デバッグビルドを使用して、あなたがLoadLibraryの後のInitInstanceを再入力する際に​​コールスタックを投稿してください。 – peterchen

+0

./abc/def.dllとは何ですか。どのようなものが読み込まれていますか?ライブラリ(循環依存性)を読み込もうとしていますか? – CashCow

+0

"CLoader_MFCApp"とこの "def.dll"の間の関係は何ですか? – patriiice

答えて

1

これは本当の解決策よりも回避策です(つまり、私は何かを読んだことがないので、私はMFCのLoadLibraryのルールを知らない私はこの技術をMFCコードで使用することはできません。

しかし、一般的に言えば、ウィンドウが操作の順序のためにヘアボアを咳打ってしまうと、コールを別のメッセージハンドラに移動するだけです。 投稿メッセージをアプリケーションに送信し、そのメッセージのハンドラを記述することもできます。

のような何か:

// in InitInstance - post a message to our main thread to handle after init instance... 
PostMessage(NULL, WM_PostInit); 

// in your message table 
ON_THREAD_MESSAGE(WM_PostInit, OnPostInit) 

// in your app 
void MyApp::OnPostInit(WPARAM,LPARAM) // both args unused 
{ 
    // try load library now...! 
} 

注:上記の "脳コード" である - テストされていないが。間違いなく、完全なコンパイルのために、詳細はマッサージする必要があります。

参考文献: http://msdn.microsoft.com/en-us/library/ms644944%28v=VS.85%29.aspx

0

私はちょうど同じissuecaused byConfiguration typeが間違っexeに設定されていたですdllをロードするためのdllではありません。

修正:Project -> Configuration Properties -> General -> Configuration Type = Dynamic Library (.dll)(誤ったアプリケーションに設定したファイル(.exe))

関連する問題