2011-01-06 1 views
3

VS2008 마법사를 사용하여 MFCApp를 만들었습니다. 내 응용 프로그램의 "InitInstance()"내에서 "LoadLibraryA()"메서드를 호출 할 때 약간의 dll 파일을로드해야합니다. 하지만 "LoadLibraryA()"를 호출하자마자 응용 프로그램의 "InitInstance()"를 다시 호출하므로 무한 재귀 항목이됩니다. 내가 뭘 잘못하고 있니?MFC APP에서 "InitInstance"에서 "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 
[email protected]() 

"Def.dll는"다른 DLL 및 MyApp를 전혀 관련이 없습니다. 이 경우 다른 dll "CORE.dll"을로드하려고합니다.

내가 알아낼 수있는 것은 InitInstance 루틴이 끝나기 전에 LoadLibrary를 호출한다는 것입니다. InitInstance 이후에 호출되는 다른 (오버라이드 할 수있는) 메서드가 있습니까 ??? 그렇다면 LoadLibrary 호출을 해당 메서드로 이동해 볼 수 있습니다 ...

+1

사용 (또한 DLL의, 가능한 경우) 디버그 빌드, 당신은 호출 스택 게시을 LoadLibrary 이후의 InitInstance를 다시 입력합니다. – peterchen

+0

./abc/def.dll이란 무엇이며 무엇이로드되고 있습니까? 라이브러리 (순환 종속성)를로드하려고합니까? – CashCow

+0

"CLoader_MFCApp"와이 "def.dll"사이의 관계, interdepency는 무엇입니까? – 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

난 그냥 Configuration type 잘못 exe로 설정하고 같은 issue, caused by 했어 로드하려는 dll에 대해서는 dll이 아닙니다.

은 수정 : Project -> Configuration Properties -> General -> Configuration Type = Dynamic Library (.dll)는 (잘못 응용 프로그램에 설정 파일 (.exe))

관련 문제