3

我已经使用 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 调用移至该方法...

4

3 回答 3

1

这更像是一种解决方法而不是真正的解决方案(即我不知道 MFC 中 LoadLibrary 的规则,因为我从来没有读过任何说你不能的东西,我也没有碰巧在我们的 MFC 代码中使用这种技术)。

但是,一般来说,如果 windows 由于操作顺序而咳出一个毛球,我只是将调用移到另一个消息处理程序。您甚至可以将线程消息发布到您的应用程序,并为该消息编写处理程序。

就像是:

// 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

于 2011-01-06T15:12:36.943 回答
1

是的,你做错了什么。你在 mfc90.dll 的 DllMain 中,从 DllMain 调用 LoadLibrary 是不安全的,在这里说:

http://msdn.microsoft.com/en-us/library/ms684175%28v=vs.85%29.aspx

于 2011-01-13T06:19:35.907 回答
0

我刚刚有相同的issue,被错误地设置为不被加载。caused byConfiguration typeexedlldll

修复:(Project -> Configuration Properties -> General -> Configuration Type = Dynamic Library (.dll)被错误地设置为应用程序(.exe))

于 2013-11-18T12:02:36.687 回答