gpt4 book ai didi

c++ - 如何在 C++ 中将 PWSTR 转换为字符串?

转载 作者:可可西里 更新时间:2023-11-01 13:27:41 26 4
gpt4 key购买 nike

我有以下代码:

// 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 转换为字符串?

最佳答案

1。呸!

微软 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;

2。警告!

这里有一个严重的缺陷。

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));

现在,继续表演。


3。宽字符

您的代码的语法问题是 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com