2010-12-13 222 views
1

我正在使用VS2008从VC6移植代码。当我运行新的构建应用程序时,出现此错误“R6031尝试初始化CRT不止一次,这表明您的应用程序存在一个错误”。尝试初始化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()的调用注释掉?

在此先感谢。

回答

3

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

查看MSDN了解详情。

编辑

我想你看错MSDN:

当建筑物使用任何的 C运行时库,以 一个DLL确保CRT是正确的 初始化,要么

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

名为init函数DllMain(),所以_CRT_INIT()被自动调用。我认为。

为什么不简单地评论这一行,看看会发生什么?

+0

MSDN说,该DLL的入口点必须明确在进程附加和进程分离上调用CRT_INIT() – ramrocket 2010-12-13 22:57:36

+0

在15年的Win32编程中,我从未需要在DllMain中显式初始化CRT。我同意egrunin的回答。 – 2010-12-14 18:17:37

0

This error code特定于混合模式组件。错误地在端口上启用了CLR吗?在从VC6到更高版本的Visual C++修订版的简单端口中,您不应该看到这一点。

该诊断指示MSIL 指令在装载机锁定期间执行。有关更多信息,请参阅 混合组件的初始化。

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

+0

不,我没有启用/ clr开关。有很多。c文件,并且它们不能使用/ clr开关编译 – ramrocket 2010-12-13 22:56:08

+0

我建议在调试器中运行此命令,以查看输出窗口和callstack是否告诉您有关发生错误时发生了什么的更多信息。 – 2010-12-14 01:13:48