2010-02-22 18 views
2

Я читаю книгу, и мне было предложено открыть пустой проект WIN32. Я создал исходный файл main.cpp и поместил его в исходную папку (это единственный файл, который у меня есть в моем проекте). В этом файле введите следующий код:: ошибка C2664: 'MessageBoxW': невозможно преобразовать параметр 2 из 'const char [40]'

#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 ========== 

Что я делаю неправильно?

ответ

7

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

MessageBox(
    NULL, 
    L"Motoko kusangai has hacked your system!", 
    L"Public Security Section 9", 
    MB_OK | MB_ICONEXCLAMATION); 
+0

Ваше право! Большое спасибо. И я думал, что много знаю о программировании. C++ - это совершенно новая игра с мячом. Я unformiluar с компиляцией для unicode. Знаете ли вы какие-либо хорошие ресурсы, которые объясняют, что это такое? И почему компилятор не нуждался в нем, и я это сделал. они тоже используют MSV. Не знаете, какая версия, но интерфейс выглядит совершенно идентично. – numerical25

+0

ха-ха, неважно, позже, позже, объясните, что я получу ошибку: P. Я ненавижу это, когда книги делают это. – numerical25

+0

говорится, что для использования L или TCHAR – numerical25

2

попробовать

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() метки.

Edit: MS Link

+0

_T() не работал в этом случае. – numerical25

+0

oh .. странно, не использовали C++ в то время, но был уверен, что это было _T, L "" должно было работать тогда :) Приветствия для ответа tho –

+1

Для 32-битной компиляции вы были бы правы. Для 64-разрядной версии MS делает широкие строки по умолчанию, не определяя _UNICODE, что означает, что '_T' и' TEXT' не работают (в этих обстоятельствах). –

4

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

Это хорошая практика в эти дни, чтобы использовать юникод строки, но если вы действительно не хотите, вы можете перейти в свойства проекта в VS и изменить набор символов «Использование Multi-Byte Character Set», который по существу доставит вам обычный 8-битный ASCII, к которому вы, вероятно, привыкли.

0

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

Смежные вопросы