2010-11-20 7 views
3

私が取り組んでいる小さなテストアプリケーションをコンパイルしようとしました。だから、短くてシンプルなものを維持するために特定のコード行がコード生成を変更した後にコード255で終了する

:私は、「マルチスレッド」は、いくつかの依存関係を取り除くためにする「マルチスレッドDLL」から私のコード生成を設定すると

、次のコード行は、(自分のアプリケーションをクラッシュ

短いパスを長いパスに変換するとクラッシュします。以下のような:

LPCSTR tmp = reinterpret_cast<LPCSTR>(getenv("Temp")); 
GetLongPathNameA(tmp,tempFolder,MAX_PATH); 

クラッシュは、特に最初の行で発生します。ここではそう

LPCSTR tmp = reinterpret_cast<LPCSTR>(getenv("Temp")); 

任意のアイデアを使用すると、コード生成モードを切り替えると、それが突然動作しなくなった理由は?ありがとう!

EDIT:

いくつかのコード書き換えた後、私はそれを見つけるために管理

getenv("Temp"); 

を実行するとき、それは他のモードで作業を行うよう、具体的に非常に非常に奇妙なシーイングがクラッシュ

+0

プロジェクトをビルドする際に警告がありますか? – Dialecticus

+0

いいえ、ありません。何らかの理由でコード255で終了します。 – zeta

+1

なぜ 'reinterpret_cast'が必要ですか? 'getenv'の結果は' char * 'です。これは自動的に' LPCSTR'( 'const char *')に変換されます。キャストなしでエラーが発生した場合、おそらく注意を向ける価値があります。 –

答えて

0

に試してみてくださいプロジェクトを再構築します。それをきれいにして、出力フォルダに何も残っていないことを確認してください。また、.ncbを削除してビルドしてください。

+0

いいえ、動作しません... – zeta

1

はあなたのケースでは、すなわち、マルチスレッドの静的なすべてのプロジェクト、(およびそれらのプロジェクトのすべてのファイル)は、一貫ランタイムライブラリの同じバージョンに対してコンパイルとリンクするように設定されていることを確認してください。これらのオプションを混在させると、コンパイルされたプログラムとリンクされたプログラムは未定義の動作をします。また、外部ライブラリ(MFCなど)の正しいバージョンに対してコンパイルしてリンクするようにしてください。場合によっては、特定のバージョンのランタイムを使用するように制限されています。 .Netと相互運用する場合は、マルチスレッドのdllバージョンを使用する必要があります。

0

ダイナミックランタイムからスタティックに切り替えた後に、libcmt.libおよびlibcpmt.libをリンカ設定の依存関係として指定しましたか?もしそうでなければ、それを試してください。そして、再構築してください。

+0

libcmt.libは既にデフォルトで既にリンクされているようです。 libpcmt.lib私は手動でリンクすることができましたが、それでもクラッシュします – zeta

0

それがによってにおいて継承または他のクラスからinherittingされるオブジェクトのためであるので、あなたは、reinterpret_castは使用しないでください。基本型の場合はstatic_cast、基本型の場合はポインタを使用してください。

+0

'dynamic_cast'については考えていませんか? 'reinterpret_cast'は継承とは関係ありません。 –

+0

@ニックマイヤー:はい、そうです。 –

1

あなたはそれにアクセスする前のgetenv()の戻り値をチェックする必要があります

LPCSTR tmp = getenv("Temp"); 
if(tmp != NULL) 
    // do something with tmp 

私の推測では、あなたのプログラムが環境変数を読み取ることができないと、結果としてNULLポインタにアクセスすると、プログラムがクラッシュにつながるということです。

Microsoftは(getenv_sの使用を推奨しています)の代わりに、ここで少し、あなたの仕事のために変更され、そのMSDNのサンプルです:

char *tmp; 
size_t requiredSize; 

getenv_s(&requiredSize, NULL, 0, "Temp"); 
tmp = (char *) malloc(requiredSize * sizeof(char)); 
if (tmp != NULL) 
{ 
    getenv_s(&requiredSize, tmp, requiredSize, "Temp"); 
    if(tmp != NULL) 
     // do something with tmp 

    free(tmp); 
} 

私は個人的にWinAPIの機能GetEnvironmentVariable(への切り替えをお勧めします)の代わりに、これはあなたを与えるだろうあなたは、問題の根本を取得(またはこれらの選択肢のいずれかを使用して、それを修正)役立つかもしれない、より詳細なエラーメッセージ(関数が失敗した場合にGetLastError()を使用)。

関連する問題