【问题标题】:How to transform const wchar_t type to LPTSTR (C++)如何将 const wchar_t 类型转换为 LPTSTR (C++)
【发布时间】:2021-01-09 09:57:38
【问题描述】:

我正在尝试修改旧插件以创建新插件(在​​ C++ 和 Visual Studio 2019 中)。编译时出现以下错误,将 TEXT 标记为红色。

E0144:“const wchar_t *”类型的值不能用于初始化 LPTSTR 类型的实体

LPTSTR process_name = TEXT("rFactor2.exe");
module_address = GetModuleBase(process_name, pID);

我调查并看到一个类似的帖子暗示了这一点:

LPTSTR process_name = foo(TEXT("rFactor2.exe"));

现在我收到以下错误:

E0020:未定义标识符“foo”

谁能告诉我如何创建 LPTSTR 格式的变量(这是GetModuleBase 期望的类型)?

【问题讨论】:

  • 这能回答你的问题吗? How to convert from wchar_t to LPSTR?
  • 非常感谢。但是为了尝试这个,我遇到了类似的问题:值类型“const char*”不能用于启动实体“LPTSTR”类型
  • 您正在尝试将 const TCHAR* (LPCTSTR) 分配给非 const 的 (LPSTR),而在 c++ 中则不能。尝试将 process_name 声明为 LPCTSTR This answer 会有所帮助

标签: c++ lptstr


【解决方案1】:

LPTSTR 定义为TCHAR*。你想要的是一个 const 指针。可以使用LPCTSTR,定义为TCHAR const*

LPCTSTR process_name = TEXT("rFactor2.exe");

如果你的函数需要一个非常量指针,你可以创建一个副本:

TCHAR process_name[] = TEXT("rFactor2.exe");

注意字符串字面量和数组的生命周期是不一样的。


这是GetModuleBase 期望的类型

考虑到您正在使用遗留代码,您的函数可能采用非常量指针并且不修改它们。如果您确定这一点并且不能继续将这些函数签名修复为 const 正确,则可以使用类型转换。这样做只是作为最后的手段:

auto process_name = const_cast<LPTSTR>(TEXT("rFactor2.exe"));

推荐阅读:

【讨论】:

  • 非常感谢,只有第三个选项让我编译了 pcode。选项LPCTSTR 也不起作用auto。当我有能力的时候,我会在有游戏的电脑上测试它。
  • @Lluís 我更新了第二个选项。现在安全多了,应该可以正常工作了。
  • 现在TCHAR process_name[] = TEXT("rFactor2.exe"); 也可以工作并且代码可以正确编译。让我们希望它现在可以作为插件工作。非常感谢!
  • const_cast&lt;LPTSTR&gt;(const char* expr) 解决了我使用LPTSTR a = _T(const char* expr) 的问题,以防有人在寻找这个。
【解决方案2】:

tstr 需要的最后一件事是 windows millenium。真的你不需要它的东西

【讨论】:

    猜你喜欢
    • 2015-08-05
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 2013-03-19
    • 2011-12-27
    • 1970-01-01
    相关资源
    最近更新 更多