-1

我在 Visual Studios 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 行)

4

2 回答 2

3

SHGetFolderPath函数确实返回 aHRESULT以显示一切是否正常。实际的“字符串”将存储在最后一个参数指向的位置:ergo into szPath. 现在你想要的是从这个 char 数组中构造字符串std::wstring applicationdatafolder (szPath)并使用它

Qs的附录出现在评论中

wstring foo(bar)vs wstring foo = bar afaik(如果我错了,请随时编辑)复制构造函数的使用更有效:

wstring foo(bar)

  1. 创建一个新的 wstring 但知道将存储什么
  2. 为来自的内容分配足够的内存bar
  3. 复制内容bar

wstring foo = bar本质上是wstring foo(); foo = bar;

  1. 创建一个新的wstring(wstring foo调用不带参数的默认构造函数)
  2. 分配 1 个字节(仅存储行结束符号)
  3. 将行结束在那里
  4. 来电operator=
  5. 释放在 2 中分配的内存。
  6. 分配足够的空间来存储内容bar
  7. 复制内容bar

当然编译器可能会识别出多余的步骤并优化代码,但是通过使用以前的版本,我们首先编写高效的代码并且不依赖编译器优化

前一个版本也更清晰一些,因为它读作“wstring命名foobar”,而后者是“wstring命名foo并分配bar给它”。注意 fakt可以是任意类型,尽管编译器理解你想要什么,但在赋值中有 a和 somebar看起来很奇怪。stringmywierdtype

于 2013-08-29T16:38:36.627 回答
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); 
于 2013-08-29T16:36:04.473 回答