2010-12-13 35 views
1

私はVC200からポートコードにVS2008を使用しています。新しいビルドアプリを実行したときに、このエラー「R6031 AttempがCRTを2回以上初期化しようとしました。これはアプリケーションのバグを示しています」CRTを複数回初期化しようとしました

この1つのアプリケーションをビルドするには合計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()を明示的に呼び出す必要はありません。これは、おそらく1つまたは別のDLLMainによって呼び出されています。

詳細はMSDNを参照してください。

編集私はあなたがMSDNを読み違えたと思う

CRTが適切であることを確認 するために、 のいずれかのCランタイムライブラリを使用してDLLをビルドします が初期化されたか、

  1. 初期化関数の名前はDllMain()で、エントリポイントそう_CRT_INIT()が自動的に呼び出されてで、

あなたはinit関数DllMain()という名前を持って- か - 12 @ _DllMainCRTStartup: は、リンカ オプション-entryで指定する必要があります。おもう。

なぜその行をコメントアウトして何が起こるかを確認してください。

+0

MSDNは、DLLのエントリポイントを明示的にしなければならないことを言いますプロセスアタッチとプロセスデタッチでCRT_INIT()を呼び出す – ramrocket

+0

15年間のWin32プログラミングでは、DllMainで明示的にCRTを初期化する必要は一度もありませんでした。私はegruninの答えに同意します。 –

0

This error codeは、混合モードアセンブリに固有です。誤ってポートのCLRを有効にしましたか?これは、VC6から後でVisual C++リビジョンへの単純なポートでは表示されません。

この診断は、MSIL 命令がローダロック時に実行されたことを示しています。詳細については、 混合アセンブリの初期化を参照してください。

あなたは[プロパティ]の下で、ソリューションエクスプローラで右クリックしたプロジェクトで、プロジェクトの設定を確認することができます設定のプロパティを見て - >一般 - >共通言語ランタイムサポート

+0

いいえ、私は/ clrスイッチを有効にしませんでした。たくさんある 。これらのファイルは/ clrスイッチを使ってコンパイルすることはできません。 – ramrocket

+0

デバッガでこれを実行して、エラーが発生したときに何が起きていたかについて、出力ウィンドウと呼び出しスタックが詳細を示すかどうかを確認することをお勧めします。 –

関連する問題