Problem mit WinAPI wahrscheinlich wegen Unicode



  • Hallo zusammen 🙂

    ich habe vor kurzem ein kleines Tutorial gemacht um micht mit der WinAPI vertraut zu machen. Dabei bin ich auf folgendes Problem im Code gestoßen:

    wc.lpszClassName = szAppName;  //<- Erster fehler zeigt hierdrauf!
    
         RegisterClassEx(&wc);
    
         hWnd = CreateWindowEx(NULL,
    						  szAppName, /*-> EDIT: const char szAppName[] = "WinAPI";*/
    						  WINDOW_TITLE,  /*-> WINDOW_TITLE "My WinAPI program"*/
    						  WS_OVERLAPPEDWINDOW, 
    						  300, 300,
    						  640, 480,
    						  NULL,
    						  NULL,
    						  hInstance,
    						  NULL); /*<- der zweite hier*/ drauf"
    

    Soweit so gut, aber dabei kam folgende Fehlermeldung:

    1>p:\projekte directx\direct3d basic\direct3d basic\main.cpp(39) : error C2440: '=': 'const char [9]' 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>p:\projekte directx\direct3d basic\direct3d basic\main.cpp(52) : error C2664: 'CreateWindowExW': Konvertierung des Parameters 2 von 'const char [9]' 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://p:\Projekte DirectX\Direct3D Basic\Direct3D Basic\Debug\BuildLog.htm" gespeichert.
    1>Direct3D Basic - 2 Fehler, 0 Warnung(en)
    

    Ich hab mich etwas schlau gemacht und in Erfahrung gebracht, dass das Problem wahrscheinlich mit Unicode zu tun hat.
    Jetzt dachte ich aber, wenn ich z.B. einen Unciodefehler bei einer MessageBox bekomme (sprich bei Strings) setze ich ein L vor den String (L"Text").
    Aber das scheint ja hier nicht zuzutreffen.

    Btw. wenn ich Unicode auf Multi-Byte umstelle, bekomme ich 2 andere Fehler, die meiner Meinung nach noch komischer sind 😃

    Ich hoffe ihr könnt mir helfen,
    danke im Voraus!



  • unicode abstellen in den projekt eigenschaften oder ein L vor das stringliteral setzen



  • Wenn ich ein L vor den String schreibe (bei #define) kommt die gleiche Fehlermeldung (hab ich aber auch geschrieben) und wenn ich Uncicode "abschalte" (ich stelle auf Multi-Byte) dann kommt diese Fehlermeldung:

    main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_Direct3DCreate9@4" in Funktion ""void __cdecl InitD3D(struct HWND__ *)" (?InitD3D@@YAXPAUHWND__@@@Z)".
    1>P:\Projekte DirectX\Direct3D Basic\Debug\Direct3D Basic.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.
    1>Das Buildprotokoll wurde unter "file://p:\Projekte DirectX\Direct3D Basic\Direct3D Basic\Debug\BuildLog.htm" gespeichert.
    1>Direct3D Basic - 2 Fehler, 0 Warnung(en)
    

    (hab ich aber auch geschrieben^^)



  • der fehler käme auch wenn die unicode fehler nicht schon vorher kämen, denn er hat nix damit zu tun!!!

    tue dies an den anfang deiner code datei und es wird funktionieren!!!

    #pragma comment(lib, "d3d9.lib")
    


  • Ok, funktioniert leider auch nicht... ich habe im übrigen die d3d9.lib im Linker schon gelinkt...
    Kurz zur Verständigung, ich bleibe schon bei der Unicode Einstellung, oder? Weil die würde ich gerne beibehalten!



  • nee die muss weg, dann sind die errors von oben ja weg. der andere fehler is'n linker fehler und der besagt daß du vergisst eine bibliothek zu linken, nämlich die wo Direct3DCreate9 drin is und das is bekanntlich d3d9.lib!!!!



  • CaptainObvious schrieb:

    nee die muss weg, dann sind die errors von oben ja weg.

    Also meinst du die Unicode Einstellung muss weg? Sorry wenn ich mich jetzt anstelle, aber das bedeutet für mich dass ich unter "Projekt->Eigentschaften->Konfigurationseigenschaften->Allgemein" und dann unter "Zeichensatz" von "Unicode-Zeichensatz verwenden" auf "Multi-Byte-Zeichensatz verwenden" umstellen muss, oder?
    Denn wenn ich das tue, dann kommt folgender Fehler auf den du geantwortet hast...

    CaptainObvious schrieb:

    der andere fehler is'n linker fehler und der besagt daß du vergisst eine bibliothek zu linken, nämlich die wo Direct3DCreate9 drin is und das is bekanntlich d3d9.lib!!!!

    Und ich habe wieder unter "Projekt->Einstellungen->...->Linker->Befehlszeile" die d3d9.lib gelinkt (genauso wie ich es sonst bei der SDL, oder SFML mache - da funktionierst immer!).



  • der linker fehler wird auch kommen wenn du UNICODE kompilierst nur kommt er logischerweise erst wenn der linker LOSLEGT und das is erst wenn der COMPILER feddich is. aber wenn du UNBEDING UNIDOOF verwenden willst, dann musst du szAppName zu einem LPWSTR machen und vor alle STRINGS ein L machen aber du wirst sehen, der LINKER fehler WIRD trotzdem KOMMEN!!



  • Ok ich sehs ein, auch wenn Unicode ja eigentlich praktisch ist (hab ich jedenfalls gelesen)^^

    Ok, dann mal Schritt für Schritt:

    1.) Unicode auf Multi-Byte umstellen - hab ich!
    2.) #pragma comment(lib, "d3d9.lib") verwenden - hab ich!
    3.) compilieren und immer noch der gleiche Linker Fehler!

    Bitte nicht steinigen wenn ich schon wieder etwas falsch mache, aber WinAPI ist halt Neuland für mich (und mit Unicode musste ich mich auch nie rumschlagen) 🙂



  • d3dx9.lib ebenfalls!!!NUN wird e3s fuznktionieren!!



  • und funktioniert es???? 😕 😕



  • ich drück nun schon 10 minuten F5 und du hast immer noch nicht geantwortet 😞



  • Sry xD

    Also, d3dx9.lib auch gelinkt, auf Multi-Byte umgestellt und es funktioniert leider immer noch nicht 😞
    Ich meine, es ist ja ein "Direct3D" Programm, also hab ich das neuste DX SDK gelinkt, etc. aber es will einfach nicht 😕





  • CaptainObvious schrieb:

    http://www.imagenetz.de/download,file=2c1df8004a1d00af154657733

    Du hast zuviel Zeit, stimmts? 😃 😃 😃
    Und wer ist Martin Richter?

    Da ich aber nicht ausschließen will, dass ich an einer anderen Stelle des Quellcodes einen Fehler gemacht habe, poste ich einfach mal den gesammte Code (entnommen aus einem Tutorial):

    Bitte schön!!!



  • Hi,
    einfach Unicode beibehalten

    #include <tchar.h>
    
    ...
    
    /*statt const char szAppName[] = "Direct3D";*/
    const TCHAR szAppName[] = TEXT("Direct3D");
    

    Sollte funktionieren

    Gruß Pingu



  • Pingu-Group schrieb:

    Hi,
    einfach Unicode beibehalten

    #include <tchar.h>
    
    ...
    
    /*statt const char szAppName[] = "Direct3D";*/
    const TCHAR szAppName[] = TEXT("Direct3D");
    

    Sollte funktionieren

    Gruß Pingu

    Ok, vielen Dank erstmal!

    Wenn ich das jetzt compiliere kommt die Fehlermeldung:

    1>p:\projekte directx\direct3d basic\direct3d basic\main.cpp(54) : error C2664: 'CreateWindowExW': Konvertierung des Parameters 3 von 'const char [26]' in 'LPCWSTR' nicht möglich
    

    Wie ich weis, ist LPCWSTR ein Datentyp für einen Unicodestring. Der dritte Parameter in CreateWindowEx ist WINDOW_TITLE, definiert als

    #define WINDOW_TITLE "My first Direct3D program"
    

    Wenn ich jetzt wie in deinem Lösungsvorschlag das gleiche mit dem WINDOW_TITLE mache, also

    const TCHAR WINDOW_TITLE[] = TEXT("My first Direct3D program");
    

    kommt wieder der Linker fehler (ich poste ihn am Ende nochmal!).

    Wenn mir das ganze dann stinkt und ich einfach als dritten Parameter L"My first Direct3D program" schreibe, kommt (wer hätte es gedacht) der Linker fehler.
    Ich gehe in diesem Fall mal nicht vom Versagen der Software, sonder vom meinem eigenen aus, aber möchte trotzdem nochmal betonen dass ich mittels #pragma comment sowohl d3d9.lib als auch d3dx9.lib gelinkt habe!

    Der Linkerfehler ->

    1>main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_Direct3DCreate9@4" in Funktion ""void __cdecl InitD3D(struct HWND__ *)" (?InitD3D@@YAXPAUHWND__@@@Z)".
    1>P:\Projekte DirectX\Direct3D Basic\Debug\Direct3D Basic.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.
    1>Das Buildprotokoll wurde unter "file://p:\Projekte DirectX\Direct3D Basic\Direct3D Basic\Debug\BuildLog.htm" gespeichert.
    1>Direct3D Basic - 2 Fehler, 0 Warnung(en)
    


  • beginner88 schrieb:

    const TCHAR WINDOW_TITLE[] = TEXT("My first Direct3D program");
    

    Semikolon weg. Du musst auch unterscheiden zwischen Linker- und Compiler-Fehlern.



  • Badestrand schrieb:

    beginner88 schrieb:

    const TCHAR WINDOW_TITLE[] = TEXT("My first Direct3D program");
    

    Semikolon weg.

    Sicher dass du dich da nicht verlesen hast? Weil das kann ja nicht sein^^

    Badestrand schrieb:

    Du musst auch unterscheiden zwischen Linker- und Compiler-Fehlern.

    Nja, ich dachte wenn der Compiler mir ne Fehlermeldung ausgibt, nach der ich falsch gelinkt habe, dann ist das ein Linkerfehler, oder? Bitte aufklären 🙄

    EDIT: Bevor ich mich schlafen lege:
    Ich denke mal es kann doch gut sein, dass ich mist mit dem SDK gemacht habe, oder? Also unter Bibliotheksdatein hab ich für das SDK folgendes eingegeben "P:\Microsoft DirectX SDK (August 2008)\Lib\x64", da ich eine 64bit Version von Vista besitze. Stimmt das, oder hab ich da was falsch gemacht?



  • Ohje ohje, sorry, vergiss meinen Post, ist schon spät 😞


Anmelden zum Antworten