Problem mit error C2440 und error C2664
-
Ich verwende als Compiler Visual C++ 9.0.
Nun zum Problem: Wenn ich folgenden Quelltext eingebe (aus dem Buch "C++ für Spieleprogrammierer") erscheinen zwei Fehlermeldungen: (Am Quelltext sollte es eigentlich nicht liegen, da er ja aus dem Buch stammt)// C++ für Spieleprogrammierer // Listing 10.1 // Ein Windows-Grundgerüst // #include <windows.h> // Prototyp der Callback-Funktion LRESULT CALLBACK WindowProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); // Hauptprogramm // int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpcmdline, int ncmdshow) { WNDCLASSEX windowclass; // Struktur für Fenstereigenschaften HWND hWnd; // Fenster-Handle MSG message; // Nachricht // Der Klassen-Name des Fensters ist frei wählbar const char szClassName[] = "Erstes Fenster"; // Struktur mit gewünschten Eigenschaften füllen // // Größe der Struktur zwischenspeichern windowclass.cbSize = sizeof (WNDCLASSEX); // Fenster soll beim Verschieben neu gezeichnet werden windowclass.style = CS_HREDRAW | CS_VREDRAW; // Zeiger auf Callback-Funktion windowclass.lpfnWndProc = WindowProc; // Keine erweiterten Einstellungen windowclass.cbClsExtra = 0; windowclass.cbWndExtra = 0; // Instanz speichern windowclass.hInstance = hInst; // Icons und Cursor festlegen windowclass.hIcon = LoadIcon (NULL, IDI_APPLICATION); windowclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION); windowclass.hCursor = LoadCursor (NULL, IDC_ARROW); // Hintergrundfarbe festlegen windowclass.hbrBackground = (HBRUSH)COLOR_BACKGROUND+1; // Ein Menü brauchen wir nicht windowclass.lpszMenuName = NULL; // Klassenname angeben windowclass.lpszClassName = szClassName; // Fensterklasse registrieren if (!RegisterClassEx (&windowclass) ) return (0); // Das Fenster erzeugen hWnd = CreateWindowEx (NULL, szClassName, "Das erste Fenster!", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 300, 250, NULL, NULL, hInst, NULL); // Prüfen, ob alles glatt ging if (hWnd == NULL) return (0); // Der "Herzschlag" des Programms. // Hier werden alle Nachrichten abgeholt, // übersetzt und weitergeleitet. while (GetMessage (&message, NULL, 0, 0) ) { TranslateMessage (&message); DispatchMessage (&message); } // Programm beenden return (int)(message.wParam); } // WinMain // Callback-Funktion zur Nachrichtenverarbeitung // LRESULT CALLBACK WindowProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { // Messages auswerten switch (message) { // Fenster schließen? (Auch Alt-F4) case WM_DESTROY: { // Nachricht zum Beenden schicken PostQuitMessage (0); return (0); } // Wurde eine Taste gedrückt? case WM_KEYDOWN: { // Ja, also je nach Taste verzweigen switch (wParam) { // Wurde "Escape" gedrückt? case VK_ESCAPE: { // Ja, also Nachricht zum Beenden schicken PostQuitMessage (0); return (0); } } } break; } // Die Nachricht wurde nicht von uns verarbeitet, also // von Windows verarbeiten lassen. return (DefWindowProc (hWnd, message, wParam, lParam) ); } // WindowProc
Die Anzeige darunter:
1>------ Erstellen gestartet: Projekt: Projektmappe2, Konfiguration: Debug Win32 ------ 1>Kompilieren... 1>Main.cpp 1>c:\mein c++\visual studio 2008\projects\projektmappe2\projektmappe2\main.cpp(54) : error C2440: '=': 'const char [15]' kann nicht in 'LPCWSTR' konvertiert werden 1> Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat. 1>c:\mein c++\visual studio 2008\projects\projektmappe2\projektmappe2\main.cpp(70) : error C2664: 'CreateWindowExW': Konvertierung des Parameters 2 von 'const char [15]' in 'LPCWSTR' nicht möglich 1> Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat. 1>Das Buildprotokoll wurde unter "file://c:\Mein C++\Visual Studio 2008\Projects\Projektmappe2\Projektmappe2\Debug\BuildLog.htm" gespeichert. 1>Projektmappe2 - 2 Fehler, 0 Warnung(en) ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
Wo könnte das Problem liegen?
-
Tobias Xy schrieb:
Ich verwende als Compiler Visual C++ 9.0.
Nun zum Problem: Wenn ich folgenden Quelltext eingebe (aus dem Buch "C++ für Spieleprogrammierer") erscheinen zwei Fehlermeldungen: (Am Quelltext sollte es eigentlich nicht liegen, da er ja aus dem Buch stammt)Doch es liegt am Quelltext, oder besser gesagt an den Projekteinstellungen.
In der Zeile...
windowclass.lpszClassName = szClassName;
...weist du einem Zeiger auf einen Unicodestring [wchar_t*] einen Ansi-String [char*] zu. In den Projekteinstellungen lässt sich die Unicodeunterstützung ein und ausstellen (Bei dir ist sie aktiv).
Die Fehlermeldung ist ohnehin recht eindeutig.
Kurz: Zuweisung von dem einem Typ in einen den anderen ist nicht möglich (Und bitte ignoriere den Hinweis auf reinterpret_cast, in diesem Fall [und in vielen anderen] ist dieser vollkommen verkehrt).
-
Und wo kann ich die deaktivieren?
-
Tobias Xy schrieb:
Und wo kann ich die deaktivieren?
Wenn ich mich nicht irre ist das der Zeichensatz in den Projekteinstellungen (Unicode gegen ich glaube MCSB oder wie es heißt austauschen)...
Sorry habe grad nicht die Einstellungen vor mir.
Aber dein Thema gehört eh nicht in das ANSI C++ unterforum, sondern eher in das Win32 oder Compilerforum. Vermutlich wird irgendwann ein Moderator den Thread entsprechend verschieben...
cu André
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Compiler- und IDE-Forum verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.