[Erledigt]D3DXLoadSurfaceFromFile Problem mit 4. Parameter



  • Hi,

    ich schlage mich seit einiger Zeit mit der DX9 Programmierung rum, und bin auch schon einige male angeeckt, aber bisher noch nie auf so einen komischen Fehler gestoßen. Das heißt, eigentlich ist der Fehler eindeutig, allerdings für mich nicht ersichtlich, was der Compiler jetzt genau von mir will 🙂

    letztendlich versuche ich oben genannte Funktion aufzurufen und zwar so:

    D3DXLoadSurfaceFromFile(m_lpSurface,      // Oberflaeche in die die Grafik geladen werden soll
                                NULL,             // Palette
                                NULL,             // Zielrechteck
                                "blubb.bmp",        // Dateiname der Grafik
                                NULL,             // Quellrechteck
                                D3DX_FILTER_NONE, // Filter
                                NULL,                // Colorkey
                                NULL);
    

    sollte eigentlich recht geläufig sein (blubb.bmp ist hier einfach mal nur ein teststring). ich habe diese funktion praktisch genauso aus meinem beispielcode herauskopiert, allerdings mit einem unterschied:

    // Dateiname der zu ladenden Grafik
    const char* FILE_NAME  = "../../media/fighter_top.png";
    
    .....
    ....
    
        D3DXLoadSurfaceFromFile(m_lpSurface,      // Oberflaeche in die die Grafik geladen werden soll
                                NULL,             // Palette
                                NULL,             // Zielrechteck
                                FILE_NAME,        // Dateiname der Grafik
                                NULL,             // Quellrechteck
                                D3DX_FILTER_NONE, // Filter
                                0,                // Colorkey
                                NULL);
    

    so, ok, klar das beispiel hat einen pointer, aber auch das habe ich versucht mit eben so ziemlich dem selben fehler.
    ich habe mich auch schon eine weile im inet umgesehen, bin aber immer wieder auf codebruchstücke gestoßen, bei denen der filename ebenso direkt in der funktion angeben wurde.

    ich weiß hier leider nicht mehr weiter, vll kann mir jemand das ganze nochmal erklären.

    mfg

    EDIT:

    hier mal die Fehlermeldung:

    error C2664: 'D3DXLoadSurfaceFromFileW': Konvertierung des Parameters 4 von 'const char [10]' in 'LPCWSTR' nicht möglich
    


  • Du scheinst dein Projekt mir aktiviertem Unicode-Flag zu kompilieren. Daher wird die Funktion D3DXLoadSurfaceFromFileW aufgerufen. Um die ASCII-Version dieser Version aufzurufen, hast du zwei verschiedene Möglichkeiten:

    1. Unicode-Flag ausschalten. (Geht irgendwo bei den Compiler-Optionen)
    2. Anstatt D3DXLoadSurfaceFromFile gleich die ASCII-Version D3DXLoadSurfaceFromFileA aufrufen.

    EDIT:
    Bei MS Visual C++ 2005 kannst du das Unicode-Flag so abschalten:
    Projekt-> [Projektname]-Eigenschaften -> Konfigurationseigenschaften -> Allgemein -> Projektstandards -> Zeichensatz auf "nicht festgelegt" setzen.

    MfG, Jochen



  • joa, schonmal danke dafür
    allerdings hängts dann leider an 2 anderen stellen o.O

    äußerst seltsam.

    EDIT: Diesmal müsste ich ein "W" anhängen, damits richtig funktioniert....
    kann mir vll mal einer erklären, was das überhaupt soll?^^

    EDIT2:

    Nachdem ich jetzt den Unicode Flag entfernt hatte, gabs 2 neue Fehler, die ich wie oben beschrieben, behoben habe, indem ich "W"´s hinten an gehängt habe. so, danach gabs die fehler nicht mehr, aber wieder 2 neue 🙄
    diesmal mit error 1120 und 1119 oder sowas^^
    nachdem ich dann besagte funktionen auskommentiert hatte, gings dann auf einmal.

    mein problem ist jetzt, was soll ich machen?^^
    mit eingestelltem unicode funktioniert mein Window aufruf richt, ohne dafür mein surface laden...

    das übersteigt meine fähigkeiten momentan kollossal^^
    erbitte sehenstlich um hilfe!

    mfg



  • Ich denke mal, dass die anderen Stellen in etwa so aussehen:

    Func(...,L"Dies ist ein String",...);
    

    Wenn das Unicode-Flag deaktiviert ist, müsstest du das L vor dem String entfernen...

    Aber das ist jetzt nur eine Vermutung von mir, für genauere Informationen müsstest du dann die entsprechenden Codezeilen und Compilermeldungen posten.



  • ok, perfekt^^
    allerdings bekomm ich jetzt wieder diese fehler:

    error LNK2001: Nicht aufgelöstes externes Symbol "_D3DXLoadSurfaceFromFileA@32".
    

    und

    fatal error LNK1120: 1 nicht aufgelöste externe Verweise.
    


  • #ifdef UNICODE
    #define D3DXLoadSurfaceFromFile D3DXLoadSurfaceFromFileW
    #else
    #define D3DXLoadSurfaceFromFile D3DXLoadSurfaceFromFileA
    #endif

    So in etwa wird D3DXLoadSurfaceFromFile definiert. Je nach Compilereinstellung wird dann entweder die A- oder W-Variante afgerufen.
    Das A steht für ASCII, die Funktion erwartet also (const) char* - Strings.
    Das W steht für Wide-Character, die Funktion erwartet also (const) wchar_t* - Strings.

    wchar_t sieht für ein Zeichen 2 Bytes vor, char allerdings nur ein Byte.
    mit wchar_t kann man also den UNICODE-Zeichensatz darstellen.

    MfG, Jochen



  • Der neue Fehler rührt daher, dass du nicht alle libs geklinkt hast. Wahrscheinlich fehlt die d3dx9.lib.
    Kannst du aber unter
    Projekt-> [Projektname]-Eigenschaften -> Konfigurationseigenschaften -> Linker -> Eingabe -> Zusätzliche Abhängigkeiten
    zu deinem Projekt hinzufügen.



  • dankeschön 🙂

    funktioniert alles wieder^^
    👍



  • Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ in das Forum Spiele-/Grafikprogrammierung 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