Visual c++ 多次尝试初始化CRT

Visual c++ 多次尝试初始化CRT,visual-c++,Visual C++,我正在使用VS2008从VC6移植代码。当我运行新的构建应用程序时,我得到了这个错误“R6031多次尝试初始化CRT。这表明你的应用程序中有一个bug” 构建此应用程序共涉及21个DLL。某些DLL中包含.c文件,并在DllMain中显式调用_CRT_INIT()。代码如下: BOOL APIENTRY DllMain (HANDLE hModule, DWORD dwReason, LPVOID lpReserved) { switch( dwReason) { case DLL_P

我正在使用VS2008从VC6移植代码。当我运行新的构建应用程序时,我得到了这个错误“R6031多次尝试初始化CRT。这表明你的应用程序中有一个bug”

构建此应用程序共涉及21个DLL。某些DLL中包含.c文件,并在DllMain中显式调用_CRT_INIT()。代码如下:

BOOL APIENTRY DllMain (HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
{
 switch( dwReason) 
 {
  case DLL_PROCESS_ATTACH:
  case DLL_THREAD_ATTACH:
  case DLL_THREAD_DETACH:
  case DLL_PROCESS_DETACH:

      if(!_CRT_INIT( hModule, dwReason, lpReserved))
    return FALSE;

   break;
 }

 return TRUE;
}
我不知道如何解决这个问题。我需要注释掉对_CRT_INIT()的调用吗


提前感谢。

是的,您不需要显式调用
\u CRT\u INIT()
。它可能被一个或另一个
DLLMain
调用

有关详细信息,请参阅

编辑

我认为您误读了MSDN:

在构建使用以下任何一种方法的DLL时: C运行时库,以便 确保CRT正确安装 初始化,或者

  • 初始化函数必须命名为DllMain()和入口点 必须使用链接器指定 选项-输入:_DllMainCRTStartup@12 - 或-
  • 您已将init函数命名为
    DllMain()
    ,因此将自动调用
    \u CRT\u init()
    。我想

    为什么不简单地注释掉那一行,看看会发生什么?

    特定于混合模式程序集。您是否在端口期间错误地启用了CLR?在VC6到VC++的较早的一个简单端口中,您不应该看到这一点。p> 此诊断指示MSIL 指令正在执行过程中 装载机锁。有关详细信息,请参阅 混合程序集的初始化


    您可以通过右键单击解决方案资源管理器中的项目来检查项目设置,然后在“属性”下查看“配置属性->常规->公共语言运行时支持”

    否,我没有启用/clr开关。有许多.c文件,无法使用/clr switch编译。我建议在调试器中运行此命令,以查看输出窗口和调用堆栈是否会告诉您有关错误发生时发生的情况的更多信息。MSDN说DLL的入口点必须显式调用CRT_INIT()关于进程连接和进程分离在15年的Win32编程中,我从未需要在DllMain中显式初始化CRT。我同意埃格鲁宁的回答。