我正在使用 SHGetSpecialFolderLocation API函数。我的应用程序设置为“使用Unicode字符集”。
这是我到目前为止所拥有的:
int main ( int, char ** )
{
LPITEMIDLIST pidl;
HRESULT hr = SHGetSpecialFolderLocation(NULL, CSIDL_PERSONAL, &pidl);
/* Confused at this point */
wstring wstrPath;
wstrPath.resize ( _MAX_PATH );
BOOL f = SHGetPathFromIDList(pidl, wstrPath.c_str () );
/* End confusion */
我得到的错误是:
error C2664: 'SHGetPathFromIDListW' : cannot convert parameter 2 from 'const wchar_t *' to 'LPWSTR'
有人可以帮忙吗?什么是正确的C ++方法?
谢谢!
答案 0 :(得分:6)
第二个参数是 out 参数,因此您不能直接传递c_str
(const
)。这可能是最简单的:
wchar_t wstrPath[MAX_PATH];
BOOL f = SHGetPathFromIDList(pidl, wstrPath);
MAX_PATH
目前为260个字符。
答案 1 :(得分:1)
std::basic_string::c_str()
将常量缓冲区返回给它的内存。如果要修改字符串,则必须执行以下操作:
wstring wstrPath;
wstrPath.resize( MAX_PATH );
BOOL f = SHGetPathFromIDList(pidl, &wstrPath[0]);
wstrPath.erase(
std::find(wstrPath.begin(), wstrPath.end(), L'\0'), wstrPath.end()
); //Throw away unused buffer space
编辑:如果你不害怕C库,这个应该也可以工作(虽然我没有测试它,就像我测试了上面的实现一样):
wstring wstrPath;
wstrPath.resize( MAX_PATH );
BOOL f = SHGetPathFromIDList(pidl, &wstrPath[0]);
wstrPath.resize(wcslen(wstrPath.c_str()));
答案 2 :(得分:1)
wstring::c_str()
返回const wchar_t*
并且只读。 LPWSTR
不是const
类型,该参数是out参数。您需要自己分配缓冲区。你可以这样做:
wchar_t buf[MAX_PATH] = {0};
BOOL f = SHGetPathFromIDList( pidl, buf );
wstring wstrPath = buf;
答案 3 :(得分:1)
您可以将basic_string中第一个数组项的地址作为指向可写字符串数据的指针。虽然C ++标准不保证这块内存必须是连续的,但这在所有已知的实现中都是安全的(How bad is code using std::basic_string as a contiguous buffer)。
std::wstring path(_MAX_PATH, L'\0');
BOOL f = SHGetPathFromIDList(pidl, &path[0]);
答案 4 :(得分:0)
wstring :: c_str()不允许您以这种方式修改其内部缓冲区。最简单的解决方法是自己创建一个wchar_t缓冲区,并将其传递给wstring构造函数:
wchar_t buf[MAX_PATH];
BOOL f = SHGetPathFromIDList(pidl, buf );
wstring wstrPath(buf);