【问题标题】:How to convert LPTSTR to LPCWSTR?如何将 LPTSTR 转换为 LPCWSTR?
【发布时间】:2013-06-14 17:52:14
【问题描述】:

我需要从LPTSTR 转换为LPCWSTR。 我需要这个,因为我从GetDlgItemText 得到LPTSTR,我将把它提供给ExtTextOut,它接受LPCWSTR

编辑: 在从GetDlgItemText 传递值之前,我将值存储在std::vector 中。之后我从std::vector 检索值,它返回给我一个空/胡言乱语。

对话框:

WORD lineLength = (WORD) SendDlgItemMessage(hwnd,IDC_EDIT1, EM_LINELENGTH, (WPARAM) 0, (LPARAM) 0);
if(lineLength > 0){
    TCHAR line[16];
    int number = GetDlgItemTextW(hwnd, IDC_EDIT1, line, 16);
    HWND parent = (HWND)GetWindowLongPtr(hwnd, GWLP_HWNDPARENT);
    LPCWSTR line2(line);
    SendMessage(parent, WM_COMMAND, MAKEWPARAM(ADD_COMBO_ITEM,0), (LPARAM)line);

它向父窗口发送一条消息,父窗口将此值添加到向量 (push_back)。 带有父窗口的类:

std::vector<LPCWSTR> comboItems

这是我使用 ExtTextOut 输出值的函数的一部分:

RECT temp;
temp.left = listItemWidth;
temp.right = width;
SetBkColor(hdc, RGB(240,240,260));
LPCWSTR comboName = L"";
for(std::vector<item>::size_type i=0; i != comboItems.size(); i++){
temp.left = listItemWidth;
    temp.right = width;
    temp.top = (currentlyClicked + 1) * listItemHeight + i * listItemHeight;
    temp.bottom = temp.top + listItemHeight;
    comboName = comboItems[i];
    ExtTextOut(hdc, temp.left+2, temp.top + 1, ETO_OPAQUE, 
                &temp, comboName, lstrlen(comboName), 0);
    DrawEdge(hdc, &temp, EDGE_RAISED, BF_RECT | BF_FLAT | BF_ADJUST);
}

【问题讨论】:

  • 仔细查看 ExtTextOut 的 MSDN Library article。并告诉我们它在哪里说它接受 LPCWSTR。您不必转换。
  • 我遇到了问题,在从 EditBox(GetDltItemText) 传递值之前,我将值存储在 std::vector 中,然后在使用 ExtTextOut 时,我从向量中调用该值。跨度>
  • std::vector 不是一个很好的字符串类型。使用 std::wstring。
  • std::vector 创建一个可变数组,我可以用我想要的任何数据填充它。而std::wstring 是一个宽字符字符串。
  • 除非您要填充的数据是字符数据。我们对这种类型的数组有一个特殊的名称,称为字符串。你应该仍然使用 std::wstring。

标签: c++ visual-studio-2010 winapi msdn


【解决方案1】:

GetDlgItemText 支持两者,ExtTextOut 也支持。这些电话是在两个不同的项目中吗?或者你在某个地方有#define UNICODE 吗?无论如何,我会推荐:

  • 修复项目或源文件,使它们都使用宽字符或多字节版本,但不能同时使用,或者

  • 显式调用GetDlgItemTextWExtTextOutA

您的数据已损坏,因为您只是将指针推入向量中。该指针指向一个堆栈变量,当您访问该指针时该变量早已不复存在。您应该将std::wstring 存储在您的向量中。

【讨论】:

  • 不,它们都在同一个项目中调用。问题是价值在途中丢失了。我认为这是一个转换问题。因为在将值存储在向量中之前,我使用消息框检查它并显示正确的值,尽管当我从 std::vector 检索它时它有时是空的、乱码、点等。
  • 这意味着你没有正确管理你的记忆。显示您的代码。
  • 我已经添加了代码,虽然我尝试使用“L”传递普通字符串,但它确实有效。
  • 请参阅有关损坏问题的附加说明。
  • 是的,存储指向无效数据的指针才是真正的问题。现在已经多次提出使用std::wstring 的建议。出于某种原因,提问者拒绝接受这个建议。
【解决方案2】:

这可以通过MultiByteToWideChar 完成。

【讨论】:

  • 或没有.. 取决于 LPTSTR 实际上取决于配置。
【解决方案3】:

CStringW s(your_LPTSTR);

那么你可以通过隐式转换来获得它。

【讨论】:

  • 没有证据表明他正在使用 ATL 或 MFC,因此 CString 类不可用。绝对没有理由比std::wstring 更喜欢它。
  • @Cody:当然有,包括 wstring 不是从窄字符串和宽字符串构造的,因此使其与配置无关
猜你喜欢
  • 2012-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-25
  • 2011-07-13
  • 1970-01-01
  • 1970-01-01
  • 2011-11-13
相关资源
最近更新 更多