1

wstringstream我已经使用并需要将其分配给 astruct类型的成员来构建一个字符串LPWSTR。我尝试使用my_stringstream.str().c_str()但得到以下编译时错误:

无法从 'const wchar_t *' 转换为 'LPWSTR'

我怎样才能做到这一点?当我尝试在 GUI 中显示字符串时,我尝试了许多不同的转换组合,或者更多的编译时错误或随机术语。

4

6 回答 6

9

您的函数需要一个指向可修改数据的指针,即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]
于 2011-08-31T23:48:36.360 回答
7

LPWSTRtypedefd 作为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 的答案

于 2011-08-31T23:43:54.197 回答
1

如果您绝对确定字符串的内容不会被修改,您可以const通过static_cast; 可以接受的情况是,例如,如果您使用 somestruct向函数提供数据,但同样struct也用于检索它,因此该成员LPWSTR不仅仅是一个LPCWSTR.

相反,如果您将传递给的函数struct需要修改字符串,那么您有两种选择。

最安全的方法是将字符串的单独副本分配为原始动态数组,WCHAR并在那里复制wstring. 您可能希望new用智能指针包装 的结果,除非您要转移字符串的所有权(在这种情况下,您可能必须使用一些特殊的分配函数)。

您也可以使用 将指针传递给字符串的内部缓冲区&YourString[0],但是(1)我不确定它是否能按标准工作,并且(2)只有在函数不会改变长度时才能正常工作您的字符串L'\0'在其末尾添加 a ;在这种情况下,您还应该重新调整字符串的实际长度。

在最后一种情况下和第一种情况下,您必须确保您传递的函数struct不要期望指向缓冲区的寿命长于您的范围wstring(小心:mystream.str()是一个临时死在您使用的那一行它,您必须将其分配给一个新变量以使其具有更广泛的范围)。

于 2011-08-31T23:46:28.313 回答
1
  wstringstream b;
    ..
    wchar_t z[100];
    b.read(z,100);

其中已知字符串长度小于 101。它可以在没有unsetf(std::ios_base::skipws)所有这些的情况下工作。并且没有ZeroMemorywchar_t 数组。

于 2017-10-05T20:25:22.213 回答
0

原因很简单:LPWSTR扩展为wchar_t *. 由于指向流内容的指针是 a const,因此不可能将其const丢弃,除非使用const_cast<LPWSTR>(my_stringstream.str().c_str()). 但是我建议不要这样做(因为你可能只是把它搞砸了和/或以这种方式修改了一些不同的东西。只有在你确定它不会被修改或修改无关紧要时才这样做。

最简单(也是最安全的解决方案)是在缓冲区中创建自己的字符串副本,wstringstream并在结构中引用这个副本。只是不要忘记稍后释放内存。

于 2011-08-31T23:46:00.890 回答
0
std::wstring temp(my_stringstream.str());
lpwstrVar = &temp[0];
于 2013-10-18T03:06:35.273 回答