WINAPI mit microsoft visual c++ zu kompilieren und mit visual studio nicht



  • hi. hab hier einen quellcode von einem normalen windowsfenster. wenn ich ihn mit microsoft visual c++ kompiliere klappt dies ohne probleme, bei visual studio allerdings werden dort 3 fehler und eine warnung angezeigt (siehe anhang)

    // *****************************************************************************
    // LISTING1.CPP
    //
    // Beispiel zur Verwendung der Win32-API
    // *****************************************************************************
    
    ////////////////////////////////////////////////////////////////////////////////
    // Includes
    ////////////////////////////////////////////////////////////////////////////////
    #include <windows.h>
    
    ////////////////////////////////////////////////////////////////////////////////
    // Funktion:		WndProc
    // Parameter:		HWND hwnd		Fensterhandle
    //					UINT message	Nachrichts-ID
    //					UINT wParam		1. Nachrichten-Parameter
    //					LONG lParam		2. Nachrichten-Parameter
    ////////////////////////////////////////////////////////////////////////////////
    // WndProc ist die Nachrichtenfunktion unseres Programms. Nur WM_PAINT und
    // WM_DESTROY werden explizit behandelt, für alle weiteren Nachrichten greifen
    // wir auf die Standardbehandlungsroutinen von Windows zurück
    ////////////////////////////////////////////////////////////////////////////////
    // Rückgabewerte:   0				kein Fehler
    ////////////////////////////////////////////////////////////////////////////////
    
    long CALLBACK WINAPI WndProc (HWND hwnd, UINT message, UINT wParam, LONG lParam)
    {
    	// lokale Variablen
    	HDC hdc;			// Handle für Gerätekontext
    	PAINTSTRUCT ps;		// Struktur für Zeichenoperationen
    	RECT rect;			// Rechteckstruktur
    
    	switch (message)
    	{
    		case WM_PAINT:						// Fenster neu zeichnen
    		{
    			// Gerätekontext bereitstellen
    			hdc = BeginPaint(hwnd, &ps);	
    
    			// Größe der zu bearbeitenden Fläche ermitteln
    			GetClientRect(hwnd, &rect);	
    
    			// Text zentriert ausgeben
    			DrawText(hdc, "See you, API World!", -1, &rect,	
    					 DT_SINGLELINE|DT_CENTER|DT_VCENTER);
    
    			// Gerätekontext wieder freigeben
    			EndPaint(hwnd, &ps);			
    
    			// Alles OK
    			return (0);					
    		}
    
    		case WM_DESTROY:					// Fenster schließen					
    		{
    			// WM_QUIT senden, um Nachrichtenschleife zu beenden
    			PostQuitMessage(0);				
    
    			// Alles OK
    			return (0);						
    		}
    
    		default:
    		{
    			// Aufruf der Standardbehandlungsroutinen für alle anderen
    			// Nachrichten
    			return DefWindowProc(hwnd, message, wParam, lParam);	
    		}
    	}
    }
    
    ////////////////////////////////////////////////////////////////////////////////
    // Funktion:		WinMain
    // Parameter:		HINSTANCE hInstance			Handle dieser Instanz
    //					HINSTANCE hPrevInstance		Handle der letzten, bereits
    //												gestarteten Instanz
    //					lpCmdLine					Zeiger auf Kommandozeilen-
    //												parameter
    //					nShowCmd					evtl. weitere Aufrufparameter
    ////////////////////////////////////////////////////////////////////////////////
    // WndProc ist die Nachrichtenfunktion unseres Programms. Nur WM_PAINT und
    // WM_DESTROY werden explizit behandelt, für alle weiteren Nachrichten greifen
    // wir auf die Standardbehandlungsroutinen von Windows zurück
    ////////////////////////////////////////////////////////////////////////////////
    // Rückgabewerte:   0				kein Fehler
    //	                1				Fehler beim Registrieren der Fensterklasse
    ////////////////////////////////////////////////////////////////////////////////
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, 
    					LPSTR lpCmdLine, int nShowCmd)
    {
    	// lokale Variablen
    
    	static char szClassName[] = "MeineErsteFensterKlasse"; // Klassenname
    	WNDCLASSEX wndclassex;			// Fensterklassenstruktur
    	MSG msg;						// Nachrichtenstruktur 
    	HWND hwnd;						// Fensterhandle
    
    	if (!hPrevInstance)
    	{
    		// wndclassex mit Werten füllen
    		wndclassex.cbSize			= sizeof(wndclassex);
    		wndclassex.style			= CS_HREDRAW | CS_VREDRAW;
    		wndclassex.lpfnWndProc		= WndProc;
    		wndclassex.cbClsExtra		= 0;
    		wndclassex.cbWndExtra		= 0;
    		wndclassex.hInstance		= hInstance;
    		wndclassex.hIcon			= LoadIcon(NULL, IDI_APPLICATION);
    		wndclassex.hIconSm			= LoadIcon(NULL, IDI_APPLICATION);
    		wndclassex.hCursor			= LoadCursor(NULL, IDC_ARROW);
    		wndclassex.hbrBackground	= (HBRUSH)GetStockObject(WHITE_BRUSH);
    		wndclassex.lpszMenuName		= NULL;
    		wndclassex.lpszClassName    = szClassName;
    
    		// Fensterklasse registrieren
    		if (!RegisterClassEx(&wndclassex)) return (1);
    	}
    
    	// Fenster erzeugen
    	hwnd = CreateWindowEx(NULL, szClassName,
    						"Mein erstes Windows Fenster",
    						WS_OVERLAPPEDWINDOW|WS_VISIBLE,
    						CW_USEDEFAULT,
    						CW_USEDEFAULT,
    						CW_USEDEFAULT,
    						CW_USEDEFAULT,
    						NULL,
    						NULL,
    						hInstance,
    						NULL);
    
    	// Fenster anzeigen und sofort aktualisieren
    	ShowWindow(hwnd, nShowCmd);
    	UpdateWindow(hwnd);
    
    	// Nachrichtenschleife
    	while (GetMessage(&msg, NULL, 0, 0))
    	{
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    
    	// Alles OK
    	return (0);
    }
    
    // *****************************************************************************
    // Ende - LISTING1.CPP
    // *****************************************************************************
    

    Fehler:

    Fehler 1 error C2664: 'DrawTextW': Konvertierung des Parameters 2 von 'const char [15]' in 'LPCWSTR' nicht möglich g:\vs 2005\saves\hellowindows\hellowindows\hellowindows.cpp 45
    Warnung 2 warning C4244: 'return': Konvertierung von 'LRESULT' in 'long', möglicher Datenverlust g:\vs 2005\saves\hellowindows\hellowindows\hellowindows.cpp 68
    Fehler 3 error C2440: '=': 'char [24]' kann nicht in 'LPCWSTR' konvertiert werden g:\vs 2005\saves\hellowindows\hellowindows\hellowindows.cpp 114
    Fehler 4 error C2664: 'CreateWindowExW': Konvertierung des Parameters 2 von 'char [24]' in 'LPCWSTR' nicht möglich g:\vs 2005\saves\hellowindows\hellowindows\hellowindows.cpp 131



  • Bei VS ist standardmäßig unicode eingestellt, d.h. du musst ein L vor die strings setzen: L"Hallo und so"(auch mit _T()). Du könntest zwar unicode ausschalten, aber auf allen WinNT ist es glaube ich besser unicode zu verwenden, da diese das von haus aus an haben, und so ANSI sogar langsamer ist.



  • Dein Programm ist in Visual Studio 2005 auf Unicode Voreingestellt ersetze "text" durch Text("Text") dann dürfte es gehen oder schalte Unicode-Zeichensatz in den Projekt einstellungen ab.

    MFG Ascharan 😃

    Edit:Ups war zu langsam 😃 :p



  • So kanns im leben gehen :p



  • wo kann ich denn unicode ausstellen? ich bin c++ ja noch am lernen und brauche es nur so für mich. D.h. ich brauche es nicht auf windows nt und so sondern nur auf meinem pc

    thx schonmal für die antworten



  • Also hast du noch ein Win98/Me/95?
    Und benutzt du VC? Wenn ja Project->Properties->CharactrerSet



  • hab windows xp. und will auf visual studio umsteigen, wenn ich diesen unicode ausstellen kann



  • XP ist ja aber ein NT, also wärs einfacher und besser, wenn du einfach L bzw _T( vor die strings machen würdest...



  • also hab auch xp und schalts auch meistens aus :p
    drücke Alt+F7
    gehe auf Konfigurationseigenschaften
    dann Zeichensatz -> auf Nicht Festgelegt



  • Jeder ist irgendwie gegen Unicode hier 😕 😕
    Ich mein das hat doch auch seinen sinn ....



  • Dennis123 schrieb:

    Jeder ist irgendwie gegen Unicode hier 😕 😕
    Ich mein das hat doch auch seinen sinn ....

    Binn nich gegen Unicode 😃 nur stürts mich bei Kleineren Projekten :p



  • thx für die antworten. ohne unicode klappt es


Anmelden zum Antworten