c++ - 在 MFC APP 中,如果我从 "LoadLibraryA"调用 "InitInstance",它会一次又一次地调用 "InitInstance"

标签 c++ visual-c++ mfc loadlibrary

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

最佳答案

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

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

关于c++ - 在 MFC APP 中,如果我从 "LoadLibraryA"调用 "InitInstance",它会一次又一次地调用 "InitInstance",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4614008/

相关文章:

C++ 获取 map 的关键字

c++ - 带有2个渲染器的VTK摄像机剪辑

c++ - 定义 _CRT_SECURE_NO_WARNINGS 会导致 vector 析构函数崩溃

windows - COMDAT 段名

mfc - 如何使用 CListCtrl 就地编辑列?

c++ - FindConnectionPoint 返回 E_NOINTERFACE

c# - Unity - 如何使用 c++ dll?

C++ 数组中的最小数字不显示

c++ - C++ 中的定宽整数

c++ - MFC 控制台应用程序中的 Main(不是 WinMain,main)