gpt4 book ai didi

c - 使用 WinAPI 在 C 中获取当前用户的桌面路径

转载 作者:太空宇宙 更新时间:2023-11-04 06:51:24 26 4
gpt4 key购买 nike

我是 WinAPI 编程的新手。我想知道如何获取用户桌面的路径,然后打印出控制台的完整路径。这是我当前的代码:

TCHAR* path = 0;
HRESULT result = SHGetKnownFolderPath(&FOLDERID_Desktop, 0, NULL, &path);
if (result == S_OK)
{
printf("%s\n", path);
}
CoTaskMemFree(path)

它确实找到了路径,但它打印出路径的“C”而不是带有斜杠的整个路径。我错过了什么?

谢谢!

最佳答案

SHGetKnownFolderPath() 输出一个 wchar_t* 指针,而不是一个 TCHAR* 指针。 SHGetKnownFolderPath() 没有 ANSI 版本,因此在这种情况下您根本不应该使用 TCHAR。事实上,除非定义了 UNICODE,因此 TCHAR 映射到 wchar_t,否则您的代码不会编译。

您只看到第一个字符的原因是因为您传递的是 wchar_t*,而预期的是 char*。在 Windows 上,wchar_t 是 16 位的,因此 wchar_t* 字符串以 UCS-2 或 UTF-16LE 编码。 UCS-2/UTF-16LE 中的所有 ASCII 字符都将其高 8 位设置为 0。您对 printf() 的使用需要一个空终止的 char* 字符串,因此第一个 wchar_t 字符的高 0x00 字节被误解为空终止符。

要执行您想要的操作,您需要按原样将返回的路径打印为宽字符串,而不是(被误解的)窄字符串。

您可以将 %Sprintf() 一起使用,例如:

PWSTR path;
if (SHGetKnownFolderPath(&FOLDERID_Desktop, 0, NULL, &path) == S_OK)
{
printf("%S\n", path);
CoTaskMemFree(path);
}

但这不能跨编译器移植。您应该将 %swprintf() 一起使用:

PWSTR path;
if (SHGetKnownFolderPath(&FOLDERID_Desktop, 0, NULL, &path) == S_OK)
{
wprintf(L"%s\n", path);
CoTaskMemFree(path);
}

关于c - 使用 WinAPI 在 C 中获取当前用户的桌面路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50594221/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com