是否有更简洁的方法从返回 wchar_t** 的 API 创建 std::wstring ?

mbl*_*mbl 1 c++ winapi

我想std::wstring从 Win32 函数中生成一个GetThreadDescription()函数。

目前,我是这样做的:

wchar_t thread_desc[MAX_PATH];
wchar_t* p = &thread_desc[0];
check_hr(GetThreadDescription(GetCurrentThread(), &p));
std::wstring wthread = std::wstring(p);
Run Code Online (Sandbox Code Playgroud)

然而,这看起来真的很尴尬,我想知道是否有更简洁的方法?

Rem*_*eau 5

GetThreadDescription()接受一个wchar_t**参数,因为它输出一个新的wchar_t*. IOW,它为字符串数据分配自己的缓冲区,并将该缓冲区分配给wchar_t*您必须提供的缓冲区。因此,你的thread_desc[]数组是无用的,只会浪费内存,所以摆脱它。GetThreadDescription()将重新分配您的pto 指向它分配的内存,LocalFree()当您使用完它时必须释放它,例如。

wchar_t* p = NULL;
check_hr(GetThreadDescription(GetCurrentThread(), &p));
std::wstring wthread(p);
LocalFree(p);
Run Code Online (Sandbox Code Playgroud)

因此,要回答您的问题 - 因为GetThreadDescription()分配了自己的内存,所以没有更简洁的方法可以将该数据转换为std::wstring,不。您唯一能做的就是将输出包装wchar_t*到一个 RAII 对象中,以确保LocalFree()即使std::wstring构造函数抛出异常也能被调用。