【问题标题】:How to Convert std::string to LPTSTR? [duplicate]如何将 std::string 转换为 LPTSTR? [复制]
【发布时间】:2017-10-31 23:05:48
【问题描述】:

我想调用一个函数 TEXT(),它接受一个 LPTSTR 类型的参数。我有std::string,我想把它转换成LPTSTR。我在网上搜索了它,但找不到我要找的确切内容,您能帮忙吗? 谢谢

【问题讨论】:

  • 我用 LPTSTR 替换了 LPCWSTR,但它不起作用。这就是我得到的——“const wchar_t* 类型的值不能用于初始化 LPTSTR 类型的实体”。
  • @prashantkn94 然后只需使用std::string::c_str()
  • “我想调用一个函数 TEXT(),它接受 LPTSTR 类型的参数。我有 std::string,我想将它转换为 LPTSTR。” 否你没有。你真的没有。停止。您不想使用TEXT 或任何基于TCHAR 的类型和函数。你只会让自己感到困惑。这些在 Windows 95/98/ME 还活着的时候使用回来,因为这些系统不提供 Unicode API。这些天你应该使用Unicode。使用std::wstringwchar_t,前缀文字加上L,使其成为宽文字,并调用函数的W版本。
  • 不是骗子,另一个问题(以及对此问题的当前答案)涉及 const 限定的 LPCTSTR/LPCWSTR 类型,但这是在询问可变的 @987654330 @(又名TCHAR*)类型。我同意@DavidHeffernan 的评论。
  • @DavidHeffernan 感谢您提供的信息,它确实有效。

标签: c++ windows winapi


【解决方案1】:

使用c_str()方法得到const char *std::string。如果它是 ASCII 并且您的项目是 Unicode(可能是),您需要将 MultiByteToWideChar 转换为 char *LPTSTR/LPWSTR

【讨论】:

  • c_str() 返回const char *,而不是char *
  • @TheForestAndTheTrees 好的。这对MultiByteToWideChar 来说并不重要。
【解决方案2】:

TEXT 不是一个函数,而是一个宏,如果您为 UNICODE 构建,它会将字符串文字声明为宽字符串。因此,您不能将其用作将 std::string 转换为 LPTSTR 的函数。 LPTSTR 取决于它是否是 UNICODE 构建,将是宽字符指针的常规字符指针。

如果您不为 unicode 构建,请使用 std::string::c_str() 运算符:

MessageBox(0, str.c_str(), str.c_str(), 0);

如果您为 unicode 构建,您可以先将 std::string 转换为 std::wstring,如果您的文本是纯 ascii:

std::wstring wstr(str.begin(), str.end());
MessageBox(0, wstr.c_str(), wstr.c_str(), 0);

或者您可以使用CA2T ATL macro,然后代码将同样适用于 unicode 和非 unicode 构建。例如:

MessageBox(0, CA2T(str.c_str()), CA2T(str.c_str()), 0);

【讨论】:

  • 你在这里没有提到的路线是使用std::wstring开头,从而避免任何转换的需要。这是前进的理想方式。
  • @DavidHeffernan 我提到了wstring,你是什么意思? OP 实际上不需要所有这些,只需 c_str() 就足够了。
  • @DavidHeffernan 从 OP 提到 LPTSTR 作为 TEXT 参数这一事实来看,他不是为 UNICODE 构建的,因此使用 wstring 开始只会让事情变得更难
  • @Ap31 我们不知道他是否正在为 UNICODE 构建。我认为他很可能是,但如果他不是,那么他应该是。
猜你喜欢
  • 2021-08-11
  • 2013-03-20
  • 2011-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-07
相关资源
最近更新 更多