Аргумент типа const char * несовместим с параметром типа "LPCWSTR"

Я пытаюсь сделать простой Message Box в C в Visual Studio 2012, но я получаю следующие сообщения об ошибках

argument of type const char* is incompatible with parameter of type "LPCWSTR"

err LNK2019:unresolved external symbol_main referenced in function_tmainCRTStartup

Вот исходный код

#include<Windows.h>

int _stdcall WinMain(HINSTANCE hinstance,HINSTANCE hPrevinstance,LPSTR lpszCmdline,int nCmdShow)
{

    MessageBox(0,"Hello","Title",0);

    return(0);
}

Пожалуйста, помогите

Спасибо и с уважением

Ответ 1

Чтобы скомпилировать ваш код в обоих режимах, вставьте строки в _T() и используйте эквиваленты TCHAR

#include <tchar.h>
#include <windows.h>

int WINAPI _tWinMain(HINSTANCE hinstance, HINSTANCE hPrevinstance, LPTSTR lpszCmdLine, int nCmdShow)
{
    MessageBox(0,_T("Hello"),_T("Title"),0);
    return 0;
}

Ответ 2

Недавно я столкнулся с этой проблемой и сделал некоторые исследования и подумал, что буду документировать некоторые из того, что я нашел здесь.

Чтобы начать, при вызове MessageBox(...) вы действительно просто вызываете макрос (для соображений обратной совместимости), который вызывает либо MessageBoxA(...) для кодировки ANSI, либо MessageBoxW(...) для кодировки Unicode.

Итак, если вы собираетесь передать строку ANSI с настройкой компилятора по умолчанию в Visual Studio, вы можете вместо этого вызвать MessageBoxA(...):

#include<Windows.h>

int _stdcall WinMain(HINSTANCE hinstance,HINSTANCE hPrevinstance,LPSTR lpszCmdline,int nCmdShow)
{

    MessageBoxA(0,"Hello","Title",0);

    return(0);
}

Полная документация для MessageBox(...) находится здесь: https://msdn.microsoft.com/en-us/library/windows/desktop/ms645505(v=vs.85).aspx

И чтобы расширить то, что сказал @cup в своем ответе, вы можете использовать макрос _T() и продолжать использовать MessageBox():

#include<tchar.h>
#include<Windows.h>

int _stdcall WinMain(HINSTANCE hinstance,HINSTANCE hPrevinstance,LPSTR lpszCmdline,int nCmdShow)
{

    MessageBox(0,_T("Hello"),_T("Title"),0);

    return(0);
}

Макрос _T() делает строку "набор символов нейтральной". Вы можете использовать это, чтобы настроить все строки как Юникод, определив символ _UNICODE перед тем, как вы построите (документация).

Надеемся, что эта информация поможет вам и всем, кто сталкивается с этой проблемой.

Ответ 3

Чтобы скомпилировать ваш код в Visual С++, вам нужно использовать функции Multi-Byte char WinAPI вместо Wide char.

Установить проект → Свойства → Общие → Набор символов для использования многобайтового набора символов

Я нашел его здесь fooobar.com/info/164159/...