Значение типа "const char *" не может быть присвоено объекту типа "LPSTR" - PullRequest
4 голосов
/ 02 апреля 2019

Возможно, на этот вопрос уже есть ответ, но я чувствовал, что мне нужно его задать, потому что, похоже, я не могу получить ответ, который мне нужен для того, чтобы код работал так, как предполагалось на VS Community 2017 , поскольку он работал хорошо VS Express Edition .

Я пытаюсь реализовать код, полученный из проекта 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 Express Edition Я просто изменил набор символов на многобайтовый, и это сработало, но в VS Community 2017 , похоже, ничего не работает, и я не вижу, как исправить сам код

Ответы [ 2 ]

8 голосов
/ 02 апреля 2019

Строковый литерал имеет тип 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*, новзаимодействие с некоторыми старыми API C, к сожалению, иногда требует использования const_cast.Прежде чем делать подобные вещи, всегда проверяйте документацию API, чтобы убедиться, что API не будет пытаться изменить содержимое строки.

В случае с MENUITEMINFO здесь,Причина, по которой dwTypeData является char*, а не const char*, наиболее вероятно, что структура предназначена для использования с GetMenuItemInfo и SetMenuItemInfo, где первый ожидает указатель на буфер, в котором он будетнаписать строку, в то время как последний ожидает указатель на буфер, из которого он будет читать строку…

0 голосов
/ 02 апреля 2019

LPSTR - это символ *. Вы не должны конвертировать из const char * в char *, даже если есть методы, когда это возможно.

Просто выделите место, затем используйте strcpy / memcpy, чтобы скопировать значение.

Или, поскольку вы играете с MENUITEMINFO, используйте одну из специальных функций, которые обрабатывают элементы меню (например, SetMenuItemInfoA)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...