GetCurrentDirectory() 正在破坏 C++ 中的代码

GetCurrentDirectory() is breaking the code in C++

本文关键字:C++ 代码 GetCurrentDirectory      更新时间:2023-10-16

在下面的代码中,如果我注释掉对"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 );
 }

iniFilePath是一个未初始化的指针,GetCurrentDirectory()试图写入它,导致未定义的行为。 GetCurrentDirectory() 不会为调用方分配缓冲区:必须提供缓冲区。

更改为:

char iniFilePath[MAX_PATH]; // or similar.

不要使用 lstrcat() ,因为它在其引用页上有警告不要使用消息,而是改用 std::string 构造路径以避免潜在的缓冲区溢出:

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

请注意buffer类似的问题,正如Wimmel所指出的。

我会这样做以获取当前目录 -

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

但是请注意,这不是线程安全的,因为目录可能会从两个调用之间的另一个线程更改,但据我所知,很少有程序更改当前目录,因此这不太可能成为问题。