Как получить путь% AppData% как std :: string?

Я читал, что можно использовать SHGetSpecialFolderPath(); чтобы получить путь AppData. Тем не менее, он возвращает TCHAR массив. Мне нужно иметь std::string,

Как это может быть преобразовано в std::string?

Обновить

Я читал, что можно использовать getenv("APPDATA"), но это не доступно в Windows XP. Я хочу поддерживать Windows XP — Windows 10.

1

Решение

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.

2

Другие решения

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,

http://en.cppreference.com/w/cpp/locale/wstring_convert

1

Вы должны использовать 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 "";
}
}
1

Введите Dede String как std :: string или std :: wstring в зависимости от конфигурации компиляции. Следующий код может быть полезен:

#ifndef UNICODE
typedef std::string String;
#else
typedef std::wstring String;
#endif
0