在下面的代码中,如果我注释掉对“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 );
}
答案 0 :(得分:8)
iniFilePath
是一个未初始化的指针,GetCurrentDirectory()
正试图写入,导致未定义的行为。 GetCurrentDirectory()
没有为调用者分配缓冲区:必须提供缓冲区。
更改为:
char iniFilePath[MAX_PATH]; // or similar.
而不是使用lstrcat()
,其警告不要在其参考页面上使用消息,而是使用std::string
来构建路径,以避免潜在的缓冲区溢出:
const std::string full_file_path(std::string(iniFilePath) + "/" + iniFileName);
请注意与buffer
类似的问题,如Wimmel所述。
答案 1 :(得分:0)
我会这样做才能获得当前目录 -
int pathLength = GetCurrentDirectory(0, NULL);
std::vector<char> iniFilePath(pathLength);
GetCurrentDirectory(pathLength, iniFilePath.data());
但请注意,这不是线程安全的,因为目录可能会从两个调用之间的另一个线程更改,但据我所知,很少有程序更改当前目录,因此不太可能出现问题。