2012-12-02 42 views
0

在下面的代码中,如果我将对“GetCurrentDirectory”的调用注释掉一切正常,但是如果我没有,那么代码会在它之后中断,但不会显示子窗口,但该程序不会崩溃。编译器不会给出任何错误。GetCurrentDirectory()打破了C++中的代码

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

为什么你总是使用'GetPrivateProfileString'?该参考文献指出,这只是为了与16位应用程序兼容,其中大部分应用程序现在应该早已消失。 –

+0

@DanielKamilKozar,因为它很容易使用.... – wimh

回答

8

iniFilePathGetCurrentDirectory()试图写入到,从而导致不确定的行为的unintialised指针。 GetCurrentDirectory()不为调用者分配缓冲区:它必须提供。

更改为:

char iniFilePath[MAX_PATH]; // or similar. 

而不是使用lstrcat(),其中有警告不要它的参考页面上使用消息,构建路径使用std::string来避免潜在的缓冲区溢出:

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

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

+1

和之后,已被修复,缓冲区也unintialised,这可以以同样的方式解决 – wimh

+0

@Wimmel,错过了!将添加到答案。谢谢。 – hmjd

+0

非常感谢hmjd。 – StudentX

0

我想这样做是为了得到当前目录 -

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

GetCurrentDirectory(pathLength, iniFilePath.data()); 

不过请注意,这不会是线程安全的,因为该目录可能从另一个线程在两个电话之间变化,但据我知道几个程序改变当前目录,所以它不太可能成为问题。

+0

返回的路径永远不会超过MAX_PATH,因此只需使用固定大小的缓冲区就更容易(也更安全)。 –

+0

Unicode GetCurrentDirectoryW()如何?在某些特定情况下,当用户能够创建实际上由NTFS支持的真正长路径时,它是否不会返回比MAX_PATH更长的路径? – JustAMartin