尝试不止一次初始化CRT

时间:2010-12-13 17:38:06

标签: visual-c++

我正在使用VS2008从VC6端口代码。当我运行新的构建应用程序时,我收到此错误“R6031 Attemp不止一次初始化CRT。这表示您的应用程序中存在错误。”

构建这个应用程序共有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()的调用?

提前致谢。

2 个答案:

答案 0 :(得分:3)

是的,您不需要明确调用_CRT_INIT()。它可能被一个或另一个DLLMain调用。

有关详细信息,请参阅MSDN

修改

我认为您误读了MSDN:

  

构建使用任何一个的DLL时   C运行时库,以便   确保CRT正确   初始化,

     
      
  1. 初始化函数必须命名为DllMain()和入口点   必须使用链接器指定   选项-entry:_DllMainCRTStartup @ 12 -   或 -
  2.   

已将命名为init函数DllMain(),因此_CRT_INIT() 会自动调用。我想。

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

答案 1 :(得分:0)

This error code特定于混合模式程序集。您是否在端口期间启用了CLR?在从VC6到更高版本的Visual C ++修订版的简单端口中,您不应该看到这一点。

  

此诊断表明MSIL   指令正在执行期间   装载机锁。有关更多信息,请参阅   混合装配的初始化。

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