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

Value of type "const char *" cannot be assigned to an entity of type "LPSTR"

本文关键字:类型 LPSTR 实体 分配 char 不能 const      更新时间:2023-10-16

这个问题可能已经有了答案,但我觉得我需要问它,因为我似乎无法得到代码在VS Community 2017上按预期工作的答案,因为它在VS Express Edition上运行良好。

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

不能将类型为"const char *"的值分配给类型的实体 "LPSTR">

无法从"常量字符 [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
  3. 速成版我只是将字符集更改为多字节,它有效,但在VS Community 2017上似乎没有任何效果,我看不到如何修复代码本身

字符串文字的类型是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*的原因很可能是该结构旨在与GetMenuItemInfoSetMenuItemInfo一起使用,其中前者需要指向缓冲区的指针,它将在其中写入字符串,而后者需要指向缓冲区的指针,它将从中读取字符串......

LPSTR 是 char *。您不应该从 const char * 转换为 char *,即使有可能时有方法。

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

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