我是WinAPI编程的新手。我想知道如何获得用户桌面的路径,然后打印出控制台的完整路径。这是我目前的代码:
TCHAR* path = 0;
HRESULT result = SHGetKnownFolderPath(&FOLDERID_Desktop, 0, NULL, &path);
if (result == S_OK)
{
printf("%s\n", path);
}
CoTaskMemFree(path)
它确实找到了路径,但它打印出来" C"用于路径而不是带有斜杠的整个路径。我错过了什么?
谢谢!
答案 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