czClassName kann nicht konvertiert werden?!



  • Hallo,

    zuersteinmal: Ich habe noch nicht viel Erfahrung mit dem ganzen Kram 😉

    Ich benutze "Visual Studio 2005 Professional Vista Sp1+Update und Vista SDK" und der ganze Haufen Software meint jetzt zu mir:

    Fehler 1 error C2440: '=': 'const char [7]' kann nicht in 'LPCWSTR' konvertiert werden d:\c++\visual studio 2005 projekte\windowsfenster\windowsfenster\windowsfenster.cpp 32

    Fehler 2 error C2664: 'CreateWindowExW': Konvertierung des Parameters 2 von 'const char [7]' in 'LPCWSTR' nicht möglich d:\c++\visual studio 2005 projekte\windowsfenster\windowsfenster\windowsfenster.cpp 48

    Und das hier ist der Code (ich habe Vorne und Hinten was weggelassen wenn ihr noch mehr braucht sagt bescheid):

    int WINAPI WinMain (HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpcmdline, int cmdshow)
    {
    	WNDCLASSEX windowclass;
    	HWND	   hWnd;
    	MSG		   message;
    
    	const char szClassName[] = "Erstes Fenster";
    
    	windowclass.cbSize = sizeof (WNDCLASSEX);
    
    	windowclass.style = CS_HREDRAW | CS_VREDRAW;
    
    	windowclass.lpfnWndProc = WindowProc;
    	windowclass.cbClsExtra = 0;
    	windowclass.cbWndExtra = 0;
    
    	windowclass.hInstance = hInst;
    
    	windowclass.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    	windowclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    	windowclass.hCursor = LoadCursor (NULL, IDC_ARROW);
    
    	windowclass.hbrBackground = (HBRUSH)COLOR_BACKGROUND+1;
    
    	windowclass.lpszMenuName = NULL;
    
    	windowclass.lpszClassName = szClassName;
    
    	if(!RegisterClassEx (&windowclass) )
    	{
    		return (0);
    	}
    
    	hWnd = CreateWindowEx (NULL,
    							szClassName,
    							"Das erste Fenster!",
    							WS_OVERLAPPEDWINDOW | WS_VISIBLE,
    							100, 100,
    							300, 250,
    							NULL,
    							NULL,
    							hInst,
    							NULL);
    

    Ich weiß nicht was ich da falsch gemacht habe, ich habe den Code nicht selbst "verfasst" sondern aus einem Buch abgeschrieben (ich lerne noch 😉 ). Kann mir einer sagen was da falsch läuft? Ist das nur Betriebsblindheit, ist VS2005 putt oder habe ich einfach nen Fehler drin?

    MfG

    samsonispro

    Edit:
    PS: Ich hoffe ich habe das richtige Forum gefunden, war mir da nich so ganz sicher. Wenn nicht tut mir das Leid. Ich hoffe auch das ich sonst nich irgendwas wichtiges übersehen habe 😉



  • Versuch's mal statt mit

    const char szClassName[] = "Erstes Fenster";
    

    mit

    LPCWSTR szClassName = "Erstes Fenster";
    


  • nope leider nicht:

    Fehler 1 error C2440: 'Initialisierung': 'const char [15]' kann nicht in 'LPCWSTR' konvertiert werden d:\c++\visual studio 2005 projekte\windowsfenster\windowsfenster\windowsfenster.cpp 11
    Fehler 2 error C2664: 'CreateWindowExW': Konvertierung des Parameters 3 von 'const char [19]' in 'LPCWSTR' nicht möglich d:\c++\visual studio 2005 projekte\windowsfenster\windowsfenster\windowsfenster.cpp 48



  • LPCWSTR szClassName = L"Erstes Fenster";
    


  • mach es so:

    const wchar_t szClassName[] = L"Erstes Fenster";
    

    du arbeitest nämlich mit Unicode, also musst du auch Unicode-Zeichenketten verwenden.
    du kannst natürlich auch Unicode abschalten.

    ...

    das gehste im Menü auf
    Project -> [Pragramm Name] Properties -> Configuration Properties -> General

    bei der Combo-Box "Configuration", wählst du "All Configurations"

    und dann ist da ein Feld bei "Project Defaults" namens "Character Set".
    Da stellst du Multi-Byte Character Set ein.



  • oder Du benutzt

    const TCHAR szClassName[] = TEXT("Erstes Fenster");
    

    Dann ist es egal ob Du UNICODE verwendest oder nicht 😉



  • wuhuuu danke für die schnelle Hilfe!! Endlich!! Nach ca 1Monat sich rumärgern habe ich nun endlich mein erstes Windows Fenster aufm Display 😉 DANKE!!

    Wo ist der Nachteil wenn ich Unicode ausschalte? Hat das irgendwelche Risiken oder Nebenwirkungen(ich stempel euch einfach mal als Ärzte oder Apotheker ab 😉 😉 )



  • so lange du keine Japanischen oder Russischen oder sonstwelche Buchstaben verwendest hat es
    nach meinem Wissen keine Nachteile.

    Eher noch Vorteile, weil ein wchar_t doppelt so viel Speicher kostet wie ein char.

    ist natürlich damit begründet, dass man mehr darin speichern kann.

    bringe mal 40.000 Schriftzeichen in einem char unter, was maximal 256 Zeichen speichern kann O.o



  • Wenn Du Unicode deaktivierst, dann kannst Du Unicode nicht verwenden;)

    Braucht man für den Anfang auch sicherlich nicht.



  • man sollte heutzutage immer unicode verwenden, es gibt keinen grund es nicht zu tun.



  • @nttan so wie ich das oben sehe gibt es gute Gründe es nicht zu tun 😃

    Ok ich gugge mal ob ich das in meiner deutschen Version auch hinkriege, danke für die Hilfe!



  • nttan schrieb:

    man sollte heutzutage immer unicode verwenden, es gibt keinen grund es nicht zu tun.

    Solange du

    DragoXP schrieb:

    keine Japanischen oder Russischen oder sonstwelche Buchstaben verwendest

    gibt es keinen Grund, es zu tun.



  • Vorteil wiederrum wäre das Windows selbst Unicode benutzt und dann nicht erst selbst hin- und ggf. zurück konvertieren muss 😉



  • Airdamn schrieb:

    oder Du benutzt

    const TCHAR szClassName[] = TEXT("Erstes Fenster");
    

    Dann ist es egal ob Du UNICODE verwendest oder nicht 😉

    👍 - Endlich - 👍 und alles andere ist Schwachsinn (char, wchar_t, LPCWSTR, ...).



  • Schwachsinn? Naja, das:

    LPCWSTR szClassName = L"Erstes Fenster";
    

    funktioniert jedenfalls Problemlos! 🙂

    Danke nochmal für eure Hilfe! Echt genial hier 🙂



  • Naja, aber nur *mit* Unicode...



  • Ne, das hat doch mit Unicode nix zu tun!

    Du bringst hier was durcheinander:
    In MSVC Projekten kann man eine *Define* setzen (UNICODE, _UNICODE); dieses Define ist nur ein *Define*!!!!!
    Dieses wirkt sich auch *nur* auf tchar.h und windows.h aus...

    Du kannst aber *jederzeit* Unicode-Funktionen verwenden, auch wenn Du diese Defines *nicht* gesetzt hast!



  • Jochen Kalmbach schrieb:

    Ne, das hat doch mit Unicode nix zu tun!

    Du bringst hier was durcheinander:
    In MSVC Projekten kann man eine *Define* setzen (UNICODE, _UNICODE); dieses Define ist nur ein *Define*!!!!!
    Dieses wirkt sich auch *nur* auf tchar.h und windows.h aus...

    Du kannst aber *jederzeit* Unicode-Funktionen verwenden, auch wenn Du diese Defines *nicht* gesetzt hast!

    Joar das ist mir schon klar, ich meinte aber eher, dass die Kombinationen aus A-, W- und Markovarianten der entsprechenden Funktionen, Strukturen etc. ein Problem sind, Beispiel:

    LPCWSTR szClassName = L"Erstes Fenster"; // nur Unicode!
    WNDCLASS data; // A- oder W, also ANSI oder UNICODE...
    data.lpszClassName = szClassName;
    

    Das erzeugt beim kompilieren auf UNICODE keine Fehler, beim kompilieren auf ANSI jedoch schon, da 'data' ja auf dem Typ WNDCLASSA basiert (wegen des Makros).

    Edit: Vertipper korrigiert


Anmelden zum Antworten