Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C++中破解代码_C++_Winapi - Fatal编程技术网

在C++中破解代码

在C++中破解代码,c++,winapi,C++,Winapi,在下面的代码中,如果我注释掉对GetCurrentDirectory的调用,一切都正常,但是如果我没有注释,那么代码在注释之后就会中断,没有子窗口显示,但是程序不会崩溃。编译器没有给出任何错误 char *iniFilePath; int lenWritten = GetCurrentDirectory( MAX_PATH, iniFilePath ); if( lenWritten ) { lstrcat( iniFilePath, iniFileName.c_str() )

在下面的代码中,如果我注释掉对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没有为调用方分配缓冲区:必须提供缓冲区

改为:

char iniFilePath[MAX_PATH]; // or similar.
与其在引用页上使用警告“请勿使用”消息,不如使用std::string来构造路径,以避免潜在的缓冲区溢出:

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

请注意缓冲区的类似问题,正如所指出的。

我这样做是为了获取当前目录-

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

GetCurrentDirectory(pathLength, iniFilePath.data());

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

在这一问题得到解决后,缓冲区也会取消初始化,这一问题也可以得到同样的解决way@Wimmel,错过了!这将增加答案。谢谢。你为什么要使用GetPrivateProfileString呢?参考文件中说,它只是为了与16位应用程序兼容,其中大部分应用程序现在应该已经过时了。@DanielKamilKozar,因为它很容易使用……返回的路径永远不会比MAX_path长,所以只使用固定大小的缓冲区更容易、更安全。Unicode GetCurrentDirectoryW呢?在某些特定情况下,当用户设法创建NTFS实际支持的非常长的路径时,它不会返回比MAX_PATH更长的路径吗?