Fehler mit Messagebox funktion

gragorl

Grünschnabel
Hallo,
ich beginne gerade mit der DirectX Programmierung und habe bereits beim ersten Programm ein Problem

Hier der Code :
Code:
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance,
 LPSTR lpcmdline, int ncmdshow)
{
 MessageBox(0,"Hallo", "hey", MB_OK | MB_ICONEXCLAMATION);
 return 0;
}

Hier der Fehler:
error C2664: "int MessageBoxW(HWND,LPCWSTR,LPCWSTR,UINT)" : Konvertierung von Argument 2 von "const char [6]" in "LPCWSTR" nicht möglich


Wäre toll wenn jemand helfen könnte.

Danke
 
Zuletzt bearbeitet von einem Moderator:

cwriter

Erfahrenes Mitglied
Hi

Dein Problem ist schnell gelöst.
Option 1: Schreibe MessageBoxA statt MessageBox.
Option 2: Stelle in den VS-Projekteinstellungen auf ANSI-Default um.
Option 3: Setze vor jeden Stringliteral ein L. Also z.B. L"Hallo" statt nur "Hallo".

Der Grund ist folgender:
Microsoft will eigentlich wchar_t pushen. Daher ist als Default das Makro #define MessageBox(...) MessageBoxW(...) gesetzt, was wchar_t* Strings verlangt (w=wide, 2 Bytes). A=ANSI=char*=7Bit/1Byte.

Microsoft mag es aber ganz speziell und einzigartig. Daher haben sie eigene Typen.
LP steht für Long Pointer, also einfach *.
CSTR steht für C-String, also nullterminierter String.
CWSTR ist ein C-Widestring, also Nullterminierter 2-Byte-String.

Deine Fehlermeldung sagt also nur: "Du gibst mir const char*, aber ich will LPCWSTR (also (const) wchar_t*)".

War das soweit verständlich? Wenn nicht, einfach nachfragen.

Gruss
cwriter

/EDIT: Das C steht natürlich für "const" und nicht C-String. STR ist aber nach wie vor "String".
 

gragorl

Grünschnabel
Wenn ich auf MessageBoxA stelle kommt dieser Fehler:
error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_main" in Funktion ""int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ)".

Nein bei jeder der Optionen kommt der Fehler den ich grad geschickt hab

Dieser fehler kommt noch zusätzlich :
fatal error LNK1120: 1 nicht aufgelöste Externe

Brauche ich vllt eine andere lib für MessageBoxA ??
 
Zuletzt bearbeitet von einem Moderator:

cwriter

Erfahrenes Mitglied
Hi

Wenn du bitte nicht alles als Einzeiler posten könntest, wären wir dir alle sehr verbunden.
@sheel: Darf ich dich bitten, ein bisschen aufzuräumen, wenn es keine Umstände macht?

Wenn ich auf MessageBoxA stelle kommt dieser Fehler:
error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_main" in Funktion ""int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ)".
Nein, du hast _main nicht definiert.
Hast du eine Win32-Applikation oder eine Konsolenanwendung erstellt?
Unter den Einstellungen bei Linker->System sollte SubSystem Windows (/SUBSYSTEM:WINDOWS) stehen, sonst sucht der Compiler nach int main() und nicht WinMain().

Gruss
cwriter
 

sheel

I love Asm
edit: Irgendwie war noch keine Antwort da, als ich die Seite geöffnet habe. Sorry :(

Hi

ändere
Code:
"Hallo"
zu
Code:
L"Hallo"
Das "warum" ist leider ein ziemlich riesiges Thema...
Sehr kurz gesagt:
Du weißt vermutlich, das "Hallo" 5 Byte sind, deren Nummernwerte durch den Ascii-Code bestimmt werden. Zumindest so bekommt man es in 99% der Schulen/Unis erklärt. Für den C-Compiler ist "Hallo" außerdem ein Bytearray bbzw. char-Array, jedes char hat ein Byte.
Der reine Ascii-Code ist aber eigentlich nur noch historisch wichtig, heute ist alles Unicode (damit auch Griechich, Russisch, Japanisch usw. kein Problem sind). Unicode ist aber nicht einfach eine größere Ascii-artige Tabelle, sondern prinzipiell anders (und viel komplizierter), zB. kann der selbe Text auf verschiedene Arten in Byte abgespeichert werden. Das häufigste Encoding, dass die Grundstruktur der Verbytung bestimmt, ist UTF8 (mit dem das Ganze kein Problem wär).
Windows (im Gegensatz zu anderen Betriebssystemen) hat aber zwei Eigenheiten: a) Es will UTF16-Daten. Ein interessantes Merkmal von UTF16 ist, dass jeder Buchstabe (mindestens) 2 Byte braucht statt 1. Soweit wäre das noch kein Problem, dein Compiler könnte für "Hallo" eben 10 passende Byte intern erzeugen, statt nur 5. b) Das ist aber leider noch nciht alles von dem Unsinn: Funktionen wie MessageBox wollen nicht 10 chars je 1 Byte, sondern 5 Exemplare vom Variablentyp "wchar_t" je 2 Byte. Und Visual Studio macht für "Hallo" aber trotz allem nur 5 einzelne chars, ohne UTF16 und ohne wchar_t. Das L ändert das.
 

gragorl

Grünschnabel
Sorry für die Einzeiler.
Ich hatte eigl eine Win32Anwendung aber als Subsystem war iwie trotzdem Konsole eingestellt.
Habe es jetzt umgestellt und es funz.
Danke Schön.

Okay danke für die Erklärung Sheel