Получение пути к рабочему столу для текущего пользователя в C с использованием WinAPI - PullRequest
0 голосов
/ 30 мая 2018

Я очень новичок в программировании 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 голосов
/ 30 мая 2018

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);
}
0 голосов
/ 30 мая 2018

Он печатает один символ, потому что вы пытались напечатать широкую строку в виде узкой строки.Вероятно, у вас определен 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...