我正在使用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()的调用?
提前致谢。
答案 0 :(得分:3)
是的,您不需要明确调用_CRT_INIT()
。它可能被一个或另一个DLLMain
调用。
有关详细信息,请参阅MSDN。
修改强>
我认为您误读了MSDN:
构建使用任何一个的DLL时 C运行时库,以便 确保CRT正确 初始化,
- 初始化函数必须命名为DllMain()和入口点 必须使用链接器指定 选项-entry:_DllMainCRTStartup @ 12 - 或 -
醇>
您已将命名为init函数DllMain()
,因此_CRT_INIT()
会自动调用。我想。
为什么不简单地注释掉那一行,看看会发生什么?
答案 1 :(得分:0)
This error code特定于混合模式程序集。您是否在端口期间启用了CLR?在从VC6到更高版本的Visual C ++修订版的简单端口中,您不应该看到这一点。
此诊断表明MSIL 指令正在执行期间 装载机锁。有关更多信息,请参阅 混合装配的初始化。
您可以通过右键单击解决方案资源管理器中的项目来检查项目设置,然后在属性下查看配置属性 - >一般 - >公共语言运行时支持