2012-12-02 69 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