getenv ("APPDATA") возвращает неверные значения, если текущий пользователь имеет имя пользователя, содержащее символы Юникода - PullRequest
0 голосов
/ 29 мая 2019

Windows предоставляет API для получения значений переменных среды с помощью getenv (). Если у текущего пользователя есть имя пользователя, содержащее локализованные символы (то есть многобайтовые символы), то getenv возвращает неправильное значение.

текущий пользователь с именем пользователя: テスト: getenv("AppData") возвращает C:\Users\???\AppData\Roaming

Возвращается C:\Users\テスト\AppData\Roaming

Есть ли альтернатива getenv в Windows?

Ответы [ 2 ]

2 голосов
/ 29 мая 2019

На самом деле, getenv не является функцией Windows API. Эта функция предоставляется средой выполнения C. Если вы хотите продолжить работу с функцией времени выполнения C, тогда вместо использования getenv следует использовать версию Unicode, _wgetenv.

Функция Windows API, которую обертывают getenv и _wgetenv, равна GetEnvironmentVariable. Вы можете в равной степени использовать эту функцию, но вы должны убедиться, что вы нацеливаете Unicode при сборке, или явно вызывать версию Unicode GetEnvironmentVariableW.

Это отвечает на прямой вопрос, который вы задали. Однако также стоит отметить, что чтение переменной APPDATA не является правильным способом получения этой информации. Вместо этого вы должны позвонить SHGetKnownFolderPath, передавая FOLDERID_RoamingAppData.

1 голос
/ 29 мая 2019

Есть ли альтернатива getenv в Windows?

Самый точный способ получить папку пользователя APPDATA - это напрямую обратиться к ОС, а не к среде вызывающегопроцесс вообще.

Вы можете использовать SHGetFolderPathW() с CSIDL_(LOCAL_)APPDATA.

В Vista и более поздних версиях вы можете (и должны) альтернативно использовать SHGetKnownFolderPath() с FOLDERID_(Roaming|Local)AppData.

...