2014-02-17 34 views
10

Ich versuche, eine einfache Message-Box in C in Visual Studio 2012 zu machen, aber ich bin immer die folgenden FehlermeldungenArgumente vom Typ const char * sind nicht kompatibel mit dem Parameter des Typs "LPCWSTR"

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

err LNK2019:unresolved external symbol_main referenced in function_tmainCRTStartup 

hier ist der Quellcode

#include<Windows.h> 

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

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

    return(0); 
} 

Bitte Hilfe

Danke und Grüße

+5

gefunden Ihr Projektes Zeichensatz Einstellung prüfen (Projekteigenschaften, Eigenschaften Konfiguration , Allgemein, Zeichensatz). Es ist wahrscheinlich auf "Use Unicode" statt "Use Multi-Byte" eingestellt. – TypeIA

+4

Sie führen Ihren Code auf einem Unicode-Betriebssystem aus. Sie sollten Unicode-Zeichenfolgen verwenden. Wie L "Hallo". Sie können die Uhr zurück auf 1991 stellen, aber es macht wenig Sinn C zu benutzen, wenn Sie das tun. –

+0

@HansPassant oder wechseln Sie zu Multibyte. Die Windows-API ist so konzipiert, dass Sie entweder/oder] (http://msdn.microsoft.com/en-us/library/windows/desktop/dd374089%28v=vs.85%29.aspx) verwenden können. Beachten Sie, dass "Multibyte" -Strings immer noch Unicode-Codepunkte codieren können. Daher muss diese Option nicht unbedingt "die Uhr auf 1991 zurückstellen". Perfekt korrekte, globalisierte, Unicode-fähige Anwendungen können mit Multibyte-Strings (statt Whole-Character-Strings) geschrieben werden. – TypeIA

Antwort

11

Um Kompilieren des Codes in beiden Modi zu machen, die Saiten in _T() umschließen und verwenden die 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; 
} 
+0

durch Ihre suggestion das Argument des Typs const char * erhalten entfernt –

+0

, aber es zeigt immer noch die Unsolve externalsymbol_main referenziert in function_tmainCRTStartup –

+0

Korrigiert den winmain Teil. Wenn Sie Visual Studio erhalten, um das Dummy-Programm für Sie zu erstellen, ist das, was es Ihnen geben wird. – cup

4

Äquivalente ich zu diesem Thema vor kurzem lief in und etwas Forschung tat und dachte, dass ich einige von dem, was dokumentieren würde ich hier gefunden.

zu starten, wenn MessageBox(...) anrufen, sind Sie wirklich nur ein Makro aufrufen (für die Abwärtskompatibilität Gründen), die entweder MessageBoxA(...) für ANSI-Codierung oder MessageBoxW(...) für Unicode-Codierung ruft.

Also, wenn Sie in einem ANSI-String mit dem Standard-Compiler-Setup in Visual Studio weitergeben wollen, können Sie MessageBoxA(...) stattdessen nennen:

#include<Windows.h> 

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

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

    return(0); 
} 

Die vollständige Dokumentation für MessageBox(...) befindet sich hier: https://msdn.microsoft.com/en-us/library/windows/desktop/ms645505(v=vs.85).aspx

Und um zu erweitern, was @cup in ihrer Antwort sagte, könnten Sie das _T() Makro verwenden und weiterhin verwenden 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); 
} 

Das Makro _T() macht die Zeichenfolge "Zeichensatz neutral". Sie können dies verwenden, um alle Zeichenfolgen als Unicode einzurichten, indem Sie vor dem Erstellen das Symbol _UNICODE definieren (documentation).

Ich hoffe, diese Informationen helfen Ihnen und allen anderen, die dieses Problem haben.

4

Um Ihren Code in Visual C++ zu kompilieren, müssen Sie Multi-Byte-Char-WinAPI-Funktionen anstelle von Wide-Char-Funktionen verwenden.

Projekt Set -> Eigenschaften -> Allgemein -> Zeichensatz Option Multi-Byte-Zeichen Set verwenden

ich es hier https://stackoverflow.com/a/33001454/5646315

+1

Sehr nützliche Antwort! – zephyr

Verwandte Themen