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

时间:2018-05-29 23:08:36

标签: c winapi

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

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

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

谢谢!

2 个答案:

答案 0 :(得分:3)

java version "10.0.1" 2018-04-17 Java(TM) SE Runtime Environment 18.3 (build 10.0.1+10) Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10.0.1+10, mixed mode) 输出SHGetKnownFolderPath()指针,而不是wchar_t*指针。没有TCHAR*的ANSI版本,因此在这种情况下您根本不应该使用SHGetKnownFolderPath()。实际上,除非定义了TCHAR,否则您的代码将无法编译,因此UNICODE会映射到TCHAR

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

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

您可以将wchar_t%S一起使用,例如:

printf()

但这在编译器中不可移植。您应该使用PWSTR path; if (SHGetKnownFolderPath(&FOLDERID_Desktop, 0, NULL, &path) == S_OK) { printf("%S\n", path); CoTaskMemFree(path); } 代替%s

wprintf()

答案 1 :(得分:0)

它打印单个字符,因为您尝试将宽字符串打印为窄字符串。您可能已定义UNICODE / _UNICODE,因此TCHAR为WCHAR。

如果您坚持使用TCHAR,则应使用tchar.h中的正确打印功能:

_tprintf(_T("%s\n"), path);

否则你可以使用宽版本:

wprintf(L"%s\n", path);

或者最糟糕的解决方案,将字符串转换为窄代码页字符串:

printf("%ls\n", path); // This might not display all Unicode characters correctly