2015-10-15 55 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'没有意义。适当的错误检查呈现不必要的。这是关键。 –