我在Visual Studio 2012中试过这个:
TCHAR szPath[MAX_PATH];
std::wstring applicationdatafolder = SHGetFolderPath(NULL, CSIDL_COMMON_APPDATA, NULL, 0, szPath);
MessageBox(NULL, applicationdatafolder, NULL, MB_OK);
我收到了这些错误:
错误C2440:'初始化':无法从'HRESULT'转换为'std :: basic_string< _Elem,_Traits,_Alloc>' (第2行)
错误C2664:'MessageBoxW':无法将参数2从'std :: wstring'转换为'LPCWSTR'(第3行)
答案 0 :(得分:3)
SHGetFolderPath
函数返回HRESULT
以显示一切是否正确。实际的“字符串”将存储在最后一个参数指向的位置:ergo into szPath
。
现在你想要的是通过std::wstring applicationdatafolder (szPath)
从这个char数组构造字符串并使用它
Qs的补遗在评论中出现
wstring foo(bar)
vs wstring foo = bar
afaik(如果我错了就随意编辑)复制构造函数的使用效率更高:
wstring foo(bar)
bar
bar
wstring foo = bar
必须wstring foo(); foo = bar;
wstring foo
调用没有params的默认构造函数)operator=
bar
bar
当然编译器可能会认识到冗余步骤并优化代码,但是通过使用以前的版本,我们首先编写了高效的代码,而不依赖于编译器优化
此前版本更清晰,因为它的内容为“从wstring
创建一个名为foo
的{{1}}”,后者是“生成bar
名为wstring
并为其分配foo
“。注意fakt bar
可以是某种任意类型,虽然编译器理解你想要的东西,但在赋值中有一个bar
和一些string
看起来很奇怪。
答案 1 :(得分:1)
TCHAR szPath[MAX_PATH];
SHGetFolderPath(NULL, CSIDL_COMMON_APPDATA, NULL, 0, szPath);
std::wstring applicationdatafolder(szPath);
MessageBox(NULL, applicationdatafolder.c_str(), NULL, MB_OK);