GetTempFileName似乎在Windows 10上被破坏

spi*_*ick 0 c++ winapi windows-7 windows-10

我有一个使用的MFC程序 GetTempFileName.在Windows 7上它可以正常工作,但是当我将相同的代码添加到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;
Run Code Online (Sandbox Code Playgroud)

在Windows7上:

Temp DB Path: C:\udb2145.tmp
Run Code Online (Sandbox Code Playgroud)

在Windows10上:

Temp DB Path: o?
Run Code Online (Sandbox Code Playgroud)

我在代码中做错了吗?或者我应该使用不同的功能?

Alg*_*ius 6

好吧,首先,当我测试你的例子时,GetTempFileName返回0,这意味着它遇到了一个错误(成功的返回值是非零的临时文件标识符).GetLastError返回-5,这意味着:"拒绝访问",我非常怀疑非管理应用程序可以写入"C:\"(至少在Windows 8+下).

您正在查看的正在打印的垃圾值是因为您没有初始化temp_file数组.你应该这样做:

TCHAR temp_file[1024] = {0};
Run Code Online (Sandbox Code Playgroud)

并且,为了使您的代码工作,将临时文件存储在实际的临时文件夹中:

GetTempFileName(temp_dir,"udb",0,temp_file);
Run Code Online (Sandbox Code Playgroud)

编辑:并且,正如其中一位评论者已经指出的那样,如果您的代码使用unicode,则需要wcout才能正确输出文件名.否则,您将只看到文件路径的第一个字符.但这会影响输出到控制台.

  • 由于使用了"udb",它显然不是Unicode构建.初始化`temp_file`没有意义.正确的错误检查会导致不必要的错误.这是关键. (2认同)