2010-12-13 224 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