我已经读过可以使用SHGetSpecialFolderPath();
来获取AppData路径。但是,它返回TCHAR
数组。我需要std::string
。
如何将其转换为std::string
?
更新
我已经读过可以使用getenv("APPDATA")
,但它在Windows XP中不可用。我想支持Windows XP - Windows 10。
答案 0 :(得分:2)
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项目的默认设置。
答案 1 :(得分: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 "";
}
}
答案 2 :(得分:1)
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
非常简单。
答案 3 :(得分:0)
Typedef String作为std :: string或std :: wstring,具体取决于您的编译配置。以下代码可能有用:
#ifndef UNICODE
typedef std::string String;
#else
typedef std::wstring String;
#endif