Fehler beim kompilieren



  • Hallo,
    ich ich habe mir ein Buch gekauft um programmieren zu lernen nun habe ich das Problem, dass eins der Beispiele aus dem Buch nicht kompilieren will. Es soll nur ein einfaches Fenster erzeugt werden und ich habe es schon unter win7 64 bit und winXP 32bit mit VS 8 und 10 versucht aber nix hat funktioniert und es war immer der selbe Fehler. hier mal der Quellcode:

    // 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
    

    und das ist der Fehler den ich immer wieder erhalte:

    1>..\Listing_10_1.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>..\Listing_10_1.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.
    

    Ich hoffe jemand kann mir schnell helfen :oo

    mfg Pudding



  • Dein Problem nennt sich UNICODE-Modus. Du kannst entweder die Projekteinstellungen ändern auf ANSI oder MULTIBYTE oder du ersetzt die char-Verwendungen durch TCHAR (und kennzeichnest String-Literale durch TEXT(...) ).



  • Ich habe ja aber nix umgestellt o.o Im Buch wird auf sowas auch nicht hingewiesen dort steht ganz einfach ich soll es so wie es ist kompilieren :oo bzw könntest du mir sagen wie ich das umstelle, damit es funktioniert?



  • Ok, ich habe mal ein bischen rumgesucht und das unicode zeugs gefunden :oo jetzt funktioniert das auch :oo hoffentlich macht es jetzt nicht bei anderen sachen macken 😕



  • Pudding schrieb:

    Ich habe ja aber nix umgestellt o.o Im Buch wird auf sowas auch nicht hingewiesen dort steht ganz einfach ich soll es so wie es ist kompilieren :oo bzw könntest du mir sagen wie ich das umstelle, damit es funktioniert?

    Dann ist das Buch vermutlich ein wenig älter. Früher wurde bei neuen Projekten per Default der ANSI-Modus verwendet, modernere VS-Versionen verwenden als Default den UNICODE-Modus (ich weiß nicht genau seit wann).


Anmelden zum Antworten