繁体   English   中英

如何从const字符串初始化LPWSTR?

[英]How to initialize LPWSTR from a const string?

我正在尝试初始化MENUITEMINFO以调用InsertMenuItem。 当尝试将const字符串分配给dwTypeData时,我收到错误。 以下代码来自MSDN示例。

我得到两种类型的赋值错误

mii.dwTypeData = "&Sample text";
mii.dwTypeData = L"&Sample text";

我正在使用Visual Studio 2019。

  MENUITEMINFO mii = { sizeof(mii) };
  mii.fMask = MIIM_STRING | MIIM_FTYPE | MIIM_ID | MIIM_STATE;
  mii.wID = idCmdFirst + IDM_DISPLAY;
  mii.fType = MFT_STRING;
  mii.dwTypeData = L"&Sample Text";
  mii.fState = MFS_ENABLED;
  if (!InsertMenuItem(hMenu, indexMenu, TRUE, &mii))
  {
    return HRESULT_FROM_WIN32(GetLastError());
  }

错误是错误(活动)E0144类型“const wchar_t *”的值不能用于初始化类型为“wchar_t *”的实体

根据Microsoft文档,第二个应该工作。 https://docs.microsoft.com/en-us/windows/win32/learnwin32/working-with-strings

编辑:这不能解决我无法初始化WCHAR因为我无法更改该答案中建议的类型。

一些Windows结构用于“获取和设置”,并且这些结构中的字符串成员指向可变字符串。 这与将字符串文字存储在只读内存中的编译器/链接器设置直接冲突。

使用带有setter函数的字符串文字在理论上是不安全的,因为它可能会写入字符串(然后将其恢复为原始内容)。

发生这种情况的唯一已知位置是CreateProcessW的命令行参数。

在所有其他地方你可能只是抛弃const:

MENUITEMINFO mii = { sizeof(mii) };
mii.dwTypeData = const_cast<LPTSTR>(TEXT("&Sample Text"));

小心! 随着Orbit中的Lightness Races指出,修改你传递的数据可能会成为一个问题。 试试这个,相反:

MENUITEMINFO mii = { sizeof(mii) };
mii.fMask = MIIM_STRING | MIIM_FTYPE | MIIM_ID | MIIM_STATE;
mii.wID = idCmdFirst + IDM_DISPLAY;
mii.fType = MFT_STRING;
wchar_t text[] = L"&Sample Text";
mii.dwTypeData = text;
mii.fState = MFS_ENABLED;

这样,你应该更安全一点 - 但不是完全! 正如RbMm指出的那样,将dwTypeData成员指向静态字符数组通常要dwTypeData 某处(外部)功能......

static thread_local wchar_t menuText[MAXTEXTLEN];

然后,用......设置mii

wcscpy(menuText, L"&Sample Text");
mii.dwTypeData = menuText;
mii.cch = MAXTEXTLEN; // But not used in this case!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM