: ошибка C2664: «MessageBoxW»: невозможно преобразовать параметр 2 из «const char [40]» - PullRequest
2 голосов
/ 22 февраля 2010

Я читаю книгу, и мне сказали открыть пустой проект WIN32. Я создал исходный файл с именем main.cpp и поместил его в исходную папку (это единственный файл, который есть в моем проекте) В этот файл поместите следующий код:

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                  LPSTR lpCmdLine, int nShowCmd)
{
    MessageBox(NULL, "Motoko kusangai has hacked your system!", "Public Security Section 9", MB_OK | MB_ICONEXCLAMATION);
}

И запусти. Но я получаю следующую ошибку:

1>c:\users\numerical25\documents\visual studio 2008\projects\begin\begin\main.cpp(6) : error C2664: 'MessageBoxW' : cannot convert parameter 2 from 'const char [40]' to 'LPCWSTR'
1>        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>Build log was saved at "file://c:\Users\numerical25\Documents\Visual Studio 2008\Projects\Begin\Begin\Debug\BuildLog.htm"
1>Begin - 1 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

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

Ответы [ 4 ]

9 голосов
/ 22 февраля 2010

В этом случае вам нужно использовать широкую строку, потому что вы компилируете для Unicode. Попробуйте префикс всех ваших строковых констант с L.

MessageBox(
  NULL, 
  L"Motoko kusangai has hacked your system!", 
  L"Public Security Section 9", 
  MB_OK | MB_ICONEXCLAMATION);
4 голосов
/ 22 февраля 2010

Классическое программирование Windows Petzold начинается с отличной главы по Юникоду, которую я бы рекомендовал прочитать. Если вы собираетесь работать с пользовательским интерфейсом Win32, я бы получил копию его книги. Учитывая то, что Win32 сейчас не в твоих руках, ты можешь купить использованные копии последнего 5-го издания менее чем за 20 долларов. В отличие от большинства технических авторов, Чарльз обладает очень разговорным стилем и использует сильные методы рассказывания историй, чтобы сделать свои книги очень удобочитаемыми, несмотря на их длину (его Windows для программирования на C # была также хороша).

В настоящее время рекомендуется использовать строки Unicode, но если вы действительно не хотите их использовать, вы можете перейти к свойствам проекта в VS и изменить набор символов на " Использовать многобайтовый Набор символов", который по сути даст вам обычный 8-битный ASCII, к которому вы, вероятно, привыкли.

2 голосов
/ 22 февраля 2010

1001 * попробовать *

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                  LPSTR lpCmdLine, int nShowCmd)
{
    MessageBox(NULL, _T("Motoko kusangai has hacked your system!"), _T("Public Security Section 9"), MB_OK | MB_ICONEXCLAMATION);
}

Каждый раз, когда вы получаете эту ошибку для некоторого статического текста, заключите статический текст в теги _T ().

Редактировать: MS Link

0 голосов
/ 29 ноября 2017

У меня была похожая ошибка, и меня заменило «Использовать многобайтовый набор символов». Я использую Visual Studio 2012.

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