Я читал, что можно использовать SHGetSpecialFolderPath();
чтобы получить путь AppData. Тем не менее, он возвращает TCHAR
массив. Мне нужно иметь std::string
,
Как это может быть преобразовано в std::string
?
Обновить
Я читал, что можно использовать getenv("APPDATA")
, но это не доступно в Windows XP. Я хочу поддерживать Windows XP — Windows 10.
T
тип означает, что SHGetSpecialFolderPath
это пара функций:
SHGetSpecialFolderPathA
для Windows в кодировке ANSI char
на основе текста, и
SHGetSpecialFolderPathW
для кодировки UTF-16 wchar_t
на основе текста, Windows «Unicode».
Вариант ANSI — это просто оболочка для варианта Unicode, и это не могу логически вывести правильный путь во всех случаях.
Но это то, что вам нужно использовать для char
на основе данных.
Альтернатива состоит в том, чтобы использовать широкий вариант функции и использовать любой механизм, который вам удобен, чтобы преобразовать широкий текстовый результат в байтово-ориентированный char
кодирование по вашему выбору, например UTF-8.
Обратите внимание, что строки UTF-8 нельзя использовать непосредственно для открытия файлов и т. Д. С помощью Windows API, поэтому этот подход предусматривает еще большее преобразование только для использования строки.
Тем не менее, я рекомендую переключиться на широкий текст в Windows.
Для этого определите символ макроса UNICODE
перед включением <windows.h>
,
Это также по умолчанию в проекте Visual Studio.
https://msdn.microsoft.com/en-gb/library/windows/desktop/dd374131%28v=vs.85%29.aspx
#ifdef UNICODE
typedef wchar_t TCHAR;
#else
typedef unsigned char TCHAR;
#endif
По сути, вы можете преобразовать этот массив в std::wstring
, Преобразование в std::string
просто с std::wstring_convert
,
Вы должны использовать SHGetSpecialFolderPathA()
чтобы функция имела дело с символами ANSI явно.
Затем просто преобразуйте массив char
в std::string
по-прежнему.
/* to have MinGW declare SHGetSpecialFolderPathA() */
#if !defined(_WIN32_IE) || _WIN32_IE < 0x0400
#undef _WIN32_IE
#define _WIN32_IE 0x0400
#endif
#include <shlobj.h>
#include <string>
std::string getPath(int csidl) {
char out[MAX_PATH];
if (SHGetSpecialFolderPathA(NULL, out, csidl, 0)) {
return out;
} else {
return "";
}
}
Введите Dede String как std :: string или std :: wstring в зависимости от конфигурации компиляции. Следующий код может быть полезен:
#ifndef UNICODE
typedef std::string String;
#else
typedef std::wstring String;
#endif