【问题标题】:GetTempFileName appears to be broken on Windows 10GetTempFileName 在 Windows 10 上似乎已损坏
【发布时间】:2016-01-14 14:13:15
【问题描述】:

我有一个使用GetTempFileName 的MFC 程序。在 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;

在 Windows7 上:

Temp DB Path: C:\udb2145.tmp

在 Windows10 上:

Temp DB Path: o▒

我的代码做错了吗?还是我应该使用其他功能?

【问题讨论】:

  • 我怀疑在您的 Windows 10 机器上您正在执行 Unicode 构建。所有这些 TCHAR 数组都变成了 wchar_tstd::cout 无法处理。请改用std::wcout
  • GetTempFileName 接受三个基于TCHAR 的字符串,但您只给它一个。另外两个,您只是假设它需要基于char 的字符串。
  • 你忽略了错误检查并收获了你刚刚的甜点

标签: c++ winapi windows-7 windows-10


【解决方案1】:

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

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

TCHAR temp_file[1024] = {0};

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

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

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

【讨论】:

  • "您只会看到文件路径的第一个字符" - 实际上,在 Unicode 构建中,您根本看不到任何字符。 std::cout 没有定义 operator&lt;&lt;(wchar_t*),但它确实有一个 operator&lt;&lt;(void*),它将输出数组本身的内存地址,而不是其内容。
  • 由于使用了"udb",这显然不是Unicode 版本。并且初始化temp_file 毫无意义。适当的错误检查使这变得不必要。这就是关键。
猜你喜欢
  • 2013-05-23
  • 2020-03-18
  • 1970-01-01
  • 2014-12-09
  • 2021-12-10
  • 2016-05-27
  • 2013-07-07
  • 1970-01-01
  • 2018-02-24
相关资源
最近更新 更多