0

次のコードで、"GetCurrentDirectory" の呼び出しをコメント アウトするとすべて正常に動作しますが、そうしないとその後でコードが壊れ、子ウィンドウは表示されませんが、プログラムはクラッシュしません。コンパイラはエラーを出しません。

 char *iniFilePath;
 int lenWritten = GetCurrentDirectory( MAX_PATH, iniFilePath );
 if( lenWritten )
 {
     lstrcat( iniFilePath, iniFileName.c_str() );
     char *buffer;
     GetPrivateProfileString( iniServerSectionName.c_str(), serverIp.c_str(), "", buffer, MAX_PATH, iniFilePath );// server ip
     MessageBox( 0, buffer, 0, 0 );
 }
 else
 {
     MessageBox( 0,0,0,0 );
 }
4

2 に答える 2

8

iniFilePath書き込みを試みている初期化されていないポインタでありGetCurrentDirectory()、未定義の動作を引き起こします。GetCurrentDirectory()呼び出し元にバッファーを割り当てません。提供する必要があります。

への変更:

char iniFilePath[MAX_PATH]; // or similar.

リファレンス ページに Warning Do not use メッセージがある を使用する代わりに、代わりに a を使用してパスを作成し、lstrcat()潜在std::stringバッファ オーバーランを回避します。

const std::string full_file_path(std::string(iniFilePath) + "/" + iniFileName);

Wimmelbufferによって指摘されているように、同様の問題に注意してください。

于 2012-12-02T10:36:12.700 に答える
0

現在のディレクトリを取得するためにこれを行います-

int pathLength = GetCurrentDirectory(0, NULL);
std::vector<char> iniFilePath(pathLength);

GetCurrentDirectory(pathLength, iniFilePath.data());

ただし、2 つの呼び出しの間にディレクトリが別のスレッドから変更される可能性があるため、これはスレッド セーフではないことに注意してください。

于 2012-12-02T10:54:48.757 に答える