【问题标题】:Value of type "const char *" cannot be assigned to an entity of type "LPSTR"“const char *”类型的值不能分配给“LPSTR”类型的实体
【发布时间】:2019-04-02 11:28:24
【问题描述】:

这个问题可能已经有了答案,但我觉得我需要问它,因为我似乎无法获得代码在 VS Community 2017 上按预期工作所需的答案,因为它有效VS 速成版

我正在尝试实现从 c 项目中提取的代码,但我看不到如何解决该错误:

“const char *”类型的值不能分配给类型实体 "LPSTR"

无法从“const char [7]”转换为“LPSTR”

    MENUITEMINFO mii = { 0 };

    mii.cbSize = sizeof(MENUITEMINFO);
    mii.fMask = MIIM_TYPE;
    mii.fType = MFT_STRING;
    mii.dwTypeData = _T("item 1"); // error is on this line
    mii.dwTypeData = _T("item 2"); // error is on this line also

注意:

  1. 这是现在 c++ 项目中的 c 代码。它在 VS Express Edition 中工作,但无法在 VS Community 2017 上编译
  2. VS 速成版我只是将字符集更改为多字节并且它工作但在 VS Community 2017 上似乎没有任何工作,我看不到如何修复代码本身

【问题讨论】:

  • LPCTSTR 相当于 const char *。
  • 在 Visual Studio 中,通常使用 T 宏将文字扩展为窄字符或宽字符和字符串。如T("item 1")
  • 我已经更新了代码
  • 无法重现...这是 C 代码还是 C++ 代码?
  • 这是您的确切代码还是类似这样的代码:const char x[] = "item 1"; info.dwTypeData = x;

标签: c++ visual-c++


【解决方案1】:

字符串文字的类型为const char[N],其内容不得修改。将字符串文字隐式转换为char* 的功能仅存在于 C++ 中,以便与 C 向后兼容。这是一件非常危险的事情,基本上已被永久弃用,最终在 C++11 中被删除。 Visual Studio 2017 将默认语言标准切换为 C++14,这很可能是您的代码在那里停止工作的原因。如果您绝对,肯定,肯定知道指向的字符串不会被修改,那么您可以使用const_cast

MENUITEMINFO mii = { 0 };

mii.cbSize = sizeof(MENUITEMINFO);
mii.fMask = MIIM_TYPE;
mii.fType = MFT_STRING;
mii.dwTypeData = const_cast<char*>("item 1");

理想情况下,您应该只使用const char*,但不幸的是,与一些旧的 C API 互操作有时需要使用const_cast。在您执行此类操作之前,请务必检查 API 文档以确保 API 不会尝试修改字符串的内容。

在您的MENUITEMINFO 的情况下,dwTypeDatachar* 而不是const char* 的原因很可能是该结构旨在与GetMenuItemInfo 和@987654333 一起使用@ 其中前者期望一个指向缓冲区的指针,它将在其中写入一个字符串,而后者期望一个指向缓冲区的指针,它将从中读取一个字符串......

【讨论】:

  • 感谢解决了这个问题,并且将字符集设置为多咬它可以工作
  • 你应该使用MAKEINTRESOURCE("item 1");而不是类型转换。
  • @S.M.我看不到任何地方都在使用资源,所以我不确定您认为MAKEINTRESOURCE 应该实现什么。除此之外,不幸的是,虽然在字符串文字上使用 MAKEINTRESOURCE 会编译,因为宏恰好使用了大量的 C 样式转换,这是完全错误的。不要那样做。
  • @JackSiro 我实际上建议只使用 Windows API 的 ANSI(以 A 结尾的名称)或 Unicode(以 W 结尾的名称)变体。所有与字符串类型相关的开关和宏的主要目的是帮助维护应该编译为使用 ANSI 或 Unicode 的代码。到目前为止,Windows 内部都是 Unicode,ANSI API 实际上只是将字符串转换并转发到 Unicode API 的包装器。现在,我只使用 Unicode API。特别是多字节设置很可能不是您认为的那样......
  • 如果您没有看到任何正在使用的资源,这并不意味着您的答案是正确的。查看 stackoverflow.com/questions/3610565/… 以发现您的经验中的 gups。
【解决方案2】:

LPSTR 是字符 *。你不应该从 const char * 转换为 char *,即使有可能的方法。

只需分配空间,然后使用 strcpy/memcpy 复制值。

或者,由于您正在使用 MENUITEMINFO,请使用处理菜单项的特定函数之一(如 SetMenuItemInfoA)

【讨论】:

  • 一开始我不知道
  • 在使用 Windows 系统结构时很难做到。
  • 请用我的代码演示一下,以便我了解如何解决这个问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-15
  • 1970-01-01
  • 2018-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多