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.


Anmelden zum Antworten