- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有以下代码:
// Fetch Local App Data folder path.
PWSTR localAppData = (PWSTR) malloc(128);
SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, NULL, &localAppData);
// Find out the absolute path to chrome.exe
stringstream ss;
ss << localAppData << "/Google/Chrome/Application/chrome.exe";
stringstreamer的.str()
的结果是008F6788/Google/Chrome/Application/chrome.exe
,这是错误的。
由于类型不兼容,我似乎无法让 stringstreamer 工作,strcat 或 wcsncat 也无法工作。
如何将此 PWSTR 转换为字符串?
最佳答案
微软 says :
typedef wchar_t* LPWSTR, *PWSTR;
所以让我们从你的测试用例中去掉那些可怕的废话,丢掉 C 垃圾:
// Fetch Local App Data folder path.
wchar_t* localAppData = new wchar_t[128];
SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, NULL, &localAppData);
stringstream ss;
ss << localAppData << "/Google/Chrome/Application/chrome.exe";
delete[] localAppData;
这里有一个严重的缺陷。
SHGetKnownFolderPath
实际上将您提供给它的指针的值设置为指向 它 分配的内存。您的代码存在内存泄漏,而我的最后一个代码片段巧妙地错误地释放了内存。
让我们通过阅读 the documentation 来解决这个问题:
ppszPath [out]
Type: PWSTR*
When this method returns, contains the address of a pointer to a null-terminated Unicode string that specifies the path of the known folder. The calling process is responsible for freeing this resource once it is no longer needed by calling CoTaskMemFree. The returned path does not include a trailing backslash. For example, "C:\Users" is returned rather than "C:\Users\".
// Fetch Local App Data folder path.
wchar_t* localAppData = 0;
SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, NULL, &localAppData);
stringstream ss;
ss << localAppData << "/Google/Chrome/Application/chrome.exe";
CoTaskMemFree(static_cast<void*>(localAppData));
现在,继续表演。
您的代码的语法问题是 localAppData 是 wchar_t
,但正常的 stringstream
可以在 char
上工作。
幸运的是,有一个名为 wstringstream
的宽字符变体,它使用 wchar_t
代替。
(请注意,这意味着您的文字也必须使用 L
字符串文字前缀从 wchar_t
构建。)
现在是最终代码:
// Fetch Local App Data folder path.
wchar_t* localAppData = 0;
SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, NULL, &localAppData);
wstringstream ss;
ss << localAppData << L"/Google/Chrome/Application/chrome.exe";
CoTaskMemFree(static_cast<void*>(localAppData));
关于c++ - 如何在 C++ 中将 PWSTR 转换为字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7448057/
我是一名优秀的程序员,十分优秀!