Надежные способы получить путь к папке с данными приложения для пользователя, не являющегося пользователем английского языка - PullRequest
0 голосов
/ 11 ноября 2018

Я хорошо использовал этот код, чтобы получить путь к папке данных приложения для моего приложения C ++.

    char* actFilePath = NULL;
    TCHAR szPath[MAX_PATH];


    if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_LOCAL_APPDATA, NULL, 0, szPath)))
    {
        PathAppend(szPath, _T("\\MyFile.txt"));
        actFilePath = wchar_to_string(szPath);
    }

Когда я запускаю этот код на некоторых неанглийских ОС Windows 8 или Windows 10, этот код завершается ошибкой (actFilePath просто нулевой).Я обнаружил, что код не работает из-за не английского имени пользователя в пути к папке, например, débarquer Matyáš или 姓 名, как вы можете видеть из пути ниже:

C:\Users\débarquer Matyáš\AppData\Local
C:\Users\姓 名\AppData\Local

Что является более надежным и менее подверженным ошибкамна всякий случай, если какое-то имя пользователя написано на их родном языке, включая китайский, японский или европейский, и т. д. Пример рабочего кода будет очень полезен.

С уважением.

==========================================================================

Обновлено до ответа от VTT 12 ноября 2018

Я создал этокод после ответа от VTT.Этот код компилируется нормально.Однако возвращенный путь к папке ведет себя неожиданно.Иногда он дает мне правильный путь, но иногда он возвращает нечитаемый путь к файлу.Что-то вроде этого.Смотрите прикрепленную ссылку для некоторых странных персонажей.У меня сложилось впечатление, что этот код нестабилен.

https://ibb.co/goLzxq

    wchar_t* actFilePath = NULL;

    if (SUCCEEDED(SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, NULL, &actFilePath)))
    {
        PathAppendW(actFilePath, L"\\MyFile.txt");
    }

Я также следовал некоторым советам из этого ответа здесь.

Как преобразовать PWSTR в строку в C ++?

1 Ответ

0 голосов
/ 11 ноября 2018

SHGetFolderPath устарело. Вы должны использовать SHGetKnownFolderPath вместо этого. Обратите внимание, что эта новая функция имеет только широкую версию символа, поэтому она правильно работает с путями Unicode.

PWSTR psz_path{};
auto const hr
{
    ::SHGetKnownFolderPath
    (
        FOLDERID_LocalAppData
    ,   KF_FLAG_DEFAULT
    ,   HANDLE{}
    ,   ::std::addressof(psz_path)
    )
};
if(SUCCEEDED(hr))
{
    assert(psz_path);
    // do something with path...
    ::CoTaskMemFree(psz_path);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...