wstringstream
我已经使用并需要将其分配给 astruct
类型的成员来构建一个字符串LPWSTR
。我尝试使用my_stringstream.str().c_str()
但得到以下编译时错误:
无法从 'const wchar_t *' 转换为 'LPWSTR'
我怎样才能做到这一点?当我尝试在 GUI 中显示字符串时,我尝试了许多不同的转换组合,或者更多的编译时错误或随机术语。
wstringstream
我已经使用并需要将其分配给 astruct
类型的成员来构建一个字符串LPWSTR
。我尝试使用my_stringstream.str().c_str()
但得到以下编译时错误:
无法从 'const wchar_t *' 转换为 'LPWSTR'
我怎样才能做到这一点?当我尝试在 GUI 中显示字符串时,我尝试了许多不同的转换组合,或者更多的编译时错误或随机术语。
您的函数需要一个指向可修改数据的指针,即wchar_t*
,但标准字符串类只公开一个指向常量的指针。假设您的函数实际上可能写入内存,我们需要为它提供一个有效的指针。
与往常一样,获取可修改缓冲区的一种简单方法是vector
:
std::vector<wchar_t> buf(mystring.begin(), mystring.end());
buf.push_back(0); // because your consumer expects null-termination
crazy_function(buf.data());
crazy_function(&buf[0]); // old-style
// need a string again?
std::wstring newstr(buf.data()); // or &buf[0]
LPWSTR
是typedef
d 作为wchar_t*
。您正在尝试将 a 转换const wchar_t*
为wchar_t*
. 你不能隐含地这样做。
您可以通过使用来解决此问题const_cast
,但前提是您确定该函数不会修改内存:
wstring str = my_stringstream.str();
LPWSTR str = const_cast<LPWSTR>(str.c_str());
请注意,您不想这样做 const_cast<LPWSTR>(my_stringstream.str().c_str())
(除非您将其传递给函数),因为这将创建一个临时字符串对象,获取它的指针,将其转换为 aLPWSTR
然后您从中获取的临时字符串str()
将在结束时被销毁那条线,让您LPWSTR
指向一个已释放的内存块。
如果您传递LPWSTR
给的函数正在修改字符串,请参阅Kerrek 的答案。
如果您绝对确定字符串的内容不会被修改,您可以const
通过static_cast
; 可以接受的情况是,例如,如果您使用 somestruct
向函数提供数据,但同样struct
也用于检索它,因此该成员LPWSTR
不仅仅是一个LPCWSTR
.
相反,如果您将传递给的函数struct
需要修改字符串,那么您有两种选择。
最安全的方法是将字符串的单独副本分配为原始动态数组,WCHAR
并在那里复制wstring
. 您可能希望new
用智能指针包装 的结果,除非您要转移字符串的所有权(在这种情况下,您可能必须使用一些特殊的分配函数)。
您也可以使用 将指针传递给字符串的内部缓冲区&YourString[0]
,但是(1)我不确定它是否能按标准工作,并且(2)只有在函数不会改变长度时才能正常工作您的字符串L'\0'
在其末尾添加 a ;在这种情况下,您还应该重新调整字符串的实际长度。
在最后一种情况下和第一种情况下,您必须确保您传递的函数struct
不要期望指向缓冲区的寿命长于您的范围wstring
(小心:mystream.str()
是一个临时死在您使用的那一行它,您必须将其分配给一个新变量以使其具有更广泛的范围)。
wstringstream b;
..
wchar_t z[100];
b.read(z,100);
其中已知字符串长度小于 101。它可以在没有unsetf(std::ios_base::skipws)
所有这些的情况下工作。并且没有ZeroMemory
wchar_t 数组。
原因很简单:LPWSTR
扩展为wchar_t *
. 由于指向流内容的指针是 a const
,因此不可能将其const
丢弃,除非使用const_cast<LPWSTR>(my_stringstream.str().c_str())
. 但是我建议不要这样做(因为你可能只是把它搞砸了和/或以这种方式修改了一些不同的东西。只有在你确定它不会被修改或修改无关紧要时才这样做。
最简单(也是最安全的解决方案)是在缓冲区中创建自己的字符串副本,wstringstream
并在结构中引用这个副本。只是不要忘记稍后释放内存。
std::wstring temp(my_stringstream.str());
lpwstrVar = &temp[0];