我使用VS2008向导创建了一个MFCApp。在我的应用程序的“InitInstance()”中,我正在调用“LoadLibraryA()”方法,因为我需要加载一些dll文件。但是当我调用“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
ntdll.dll!_LdrpCallInitRoutine@16()
ntdll.dll!_LdrpRunInitializeRoutines@4()
ntdll.dll!_LdrpLoadDll@24()
ntdll.dll!_LdrLoadDll@16()
kernel32.dll!_LoadLibraryExW@12()
kernel32.dll!_LoadLibraryExA@12()
kernel32.dll!_LoadLibraryA@4()
MyApp.exe!CLoader_MFCApp::InitInstance() C++
mfc90.dll!AfxWinMain(HINSTANCE__ *, HINSTANCE__ *, char *, int) C++
MyApp.exe!__tmainCRTStartup() C
kernel32.dll!_BaseProcessStart@4()
“Def.dll”是任何其他dll,与MyApp完全无关。在这种情况下,我正在尝试加载另一个DLL“CORE.dll”
我可以理解的是,我在InitInstance例程结束之前调用了LoadLibrary。是否有任何其他(可覆盖的)方法在InitInstance之后调用???如果是这样,我可以尝试将LoadLibrary调用移动到该方法......
答案 0 :(得分: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
答案 1 :(得分:1)
是的,你做错了什么。 你在mfc90.dll的DllMain中,从DllMain调用LoadLibrary是不安全的,就在这里说:
http://msdn.microsoft.com/en-us/library/ms684175%28v=vs.85%29.aspx
答案 2 :(得分:0)
我刚刚issue
,caused by
Configuration type
被exe
错误地设置为dll
而dll
Project -> Configuration Properties -> General -> Configuration Type = Dynamic Library (.dll)
加载。
修复:{{1}}(错误地设置为应用程序(.exe))