Невозможно преобразовать параметр из 'const char [20]' в "LPCWSTR" - PullRequest
3 голосов
/ 30 марта 2011

При компиляции этого кода:

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInsance,HINSTANCE hPrevInstance,PSTR cmdLine,int showCmd){
    MessageBox(0,"First Win32 Program","Window Tittle",MB_OK);
    }

Я получаю ошибку компилятора:

Ошибка C2664: «MessageBoxW»: невозможно преобразовать параметр 2 из «const char [20]» в «LPCWSTR» 1> Указанные типы не связаны; преобразование требует reinterpret_cast, приведение в стиле C или приведение в стиле функции

Что я делаю не так?

Ответы [ 3 ]

14 голосов
/ 30 марта 2011

По умолчанию UNICODE определено в Visual Studio 2010. Либо вызовите MessageBoxA вместо использования MessageBox для определения, либо передайте литерал с широкой строкой ( L"Первая программа Win32" и L"Заголовок окна") или, если вы действительно хотите иметь возможность строить без определения UNICODE, используйте макрос _T вокруг строковых литералов: _T ("Первая программа Win32") (это то же самое, что L «Первая программа Win32», когда определен UNICODE, но это будет «Первая программа Win32», если UNICODE не определено).

Для получения дополнительной информации о UNICODE и о том, как это влияет на то, как называются API, см. Эту ссылку: http://msdn.microsoft.com/en-us/goglobal/bb688113.aspx. В частности, в разделах ниже «Создание приложений Win32 Unicode».

Примечание: все операционные системы Windows, поддерживаемые сегодня Microsoft, являются родными для Unicode. Я бы рекомендовал всегда отдавать предпочтение «широкому» API. В этом случае MessageBoxW, то есть то, что MessageBox определено, когда установлено UNICODE. Дни использования макроса _T и компиляции без определения UNICODE должны быть позади.

3 голосов
/ 30 марта 2011

Вы определили UNICODE, поэтому MessageBox ожидает широкую строку.

0 голосов
/ 09 мая 2016

MessageboxW ожидает широкий символ ... Вы можете внести небольшие изменения в свой код, и тогда ваш код будет работать идеально.Решение первое: - MessageBox (0, L "Первая программа Win32", L "Window Tittle", MB_OK);Решение второе.Используйте MessageboxA вместо Messagebox.MessageboxA будет принимать символ в наборе символов ANCI.

...