SHGetKnownFolderPath()
выводит указатель wchar_t*
, а не указатель TCHAR*
.Нет версии ANSI SHGetKnownFolderPath()
, поэтому вам не следует использовать TCHAR
в этой ситуации.Фактически, ваш код не будет компилироваться, если не определено UNICODE
, поэтому TCHAR
отображается на wchar_t
.
Причина, по которой вы видите только 1-й символ, заключается в том, что вы передаете wchar_t*
, где a char*
ожидается.В Windows wchar_t
является 16-битным, поэтому строки wchar_t*
кодируются в UCS-2 или UTF-16LE.Все символы ASCII в UCS-2 / UTF-16LE имеют свои старшие 8 битов, установленные на 0. Ваше использование 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()
вместо:
PWSTR path;
if (SHGetKnownFolderPath(&FOLDERID_Desktop, 0, NULL, &path) == S_OK)
{
wprintf(L"%s\n", path);
CoTaskMemFree(path);
}