2015-10-15 45 views
-1

被打破我有一個使用GetTempFileName MFC程序。在Windows 7上,它可以正常工作,但是當我將相同的代碼加入Windows 10時,它會產生垃圾。GetTempFileName出現在Windows 10

TCHAR temp_dir[1024]; 
GetTempPath(1024,temp_dir); 
TCHAR temp_file[1024]; 
GetTempFileName("C:\\","udb",0,temp_file); 
std::cout << "Temp DB Path: " << temp_file << std::endl; 

的Windows7上:

Temp DB Path: C:\udb2145.tmp 

在Windows10:

Temp DB Path: o▒ 

難道我做錯了什麼在我的代碼?或者我應該使用不同的功能?

+1

我懷疑你的Windows 10的機器上,你在做一個Unicode版本。所有這些TCHAR數組都變成'wchar_t',而'std :: cout'不能處理。請改用'std :: wcout'。 –

+0

'GetTempFileName'需要三個'TCHAR'的字符串,但你只給它一個。另外兩個,你只是假設它需要'char'的字符串。 – chris

+0

你忽略了錯誤檢查和收穫你只是甜點 –

回答

6

好吧,首先,我測試你的榜樣,GetTempFileName返回0,這意味着它(的成功是非零臨時文件標識符返回值)時遇到錯誤。 GetLastError返回-5,這意味着:「訪問被拒絕」,我非常懷疑非管理應用程序可以寫入「C:\」(至少在Windows 8+下)。

你所看到的垃圾值,正在印刷,是因爲你沒有初始化數組temp_file。你應該做的是這樣的:

TCHAR temp_file[1024] = {0}; 

而且,爲了使你的代碼工作,存儲在實際的臨時文件夾中的臨時文件:

GetTempFileName(temp_dir,"udb",0,temp_file); 

編輯:而且,正如已經指出的評論者之一如果你的代碼使用unicode,你需要wcout來正確輸出文件名。否則,您只會看到文件路徑的第一個字符。但是這會影響輸出到控制檯。

+1

「*你只能看到文件路徑*的第一個字符」 - 事實上,在Unicode版本,您將不會看到任何文字都沒有。 '的std :: cout'不具有操作者'<<(wchar_t的*)'定義的,但是它確實有一個'的operator <<(無效*)'代替,這將輸出數組本身,而不是它的存儲器地址內容。 –

+2

由於使用了「」udb「」,這顯然不是一個Unicode版本。初始化'temp_file'沒有意義。適當的錯誤檢查呈現不必要的。這是關鍵。 –