Probleme mit dynamischer DLL-Einbindung



  • Hallo alle miteinander, mein Problem ist folgendes:

    Ich habe für meine Wanabee-Engine ein Interface mit API-Wrappern designt und bereits für D3D implementiert, in einer dynamischen DLL.
    Auch die Einbindung funktioniert theoretisch wunderschön, bloß dass ich einen mir nicht erklärbaren Fehler bekommen hab.
    Nach langem suchen im Debugger von vcpp und durchquetschen von Assembler-Zeilen hab ich herausgefunden, das die Init()-Methode meines Devices irgendwie "keine Argumente bekommt" 😕

    Ich habe zigmal überprüft, eingebunden wird die DLL, auch die Instanz wird korrekt erstellt. Jetz isses bloß so, das jegliche Argumente, die ich an die Methode übergebe, in der Funktion komplett anders gesetzt werden.
    Bei einem Aufruf der Form

    Init(Width, Height, Depth);
    Init(800, 600, 24);
    

    sind in der Methode die Werte z.B:

    Width = 1464344620;
    Height = 807421006;
    Depth = 2020353400;
    

    Meine Frage im speziellen:
    Liegt das an der DLL-Architektur? Dass ich irgendwas zusätzliches bei der Definition der Klasse angeben muss etc? Oder darf ich wieder stundenlang nach Fehlern in der Engine suchen? ;_;
    Wenn jemand das Problem kennt oder einen Tip hat, wäre ich dankbar 😉

    -cyph



  • Dieser Thread wurde von Moderator/in rapso aus dem Forum Spiele-/Grafikprogrammierung in das Forum MFC mit dem Visual C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • - Lädst du die dll selbst üder LoadLibrary/GetProcAdr, oder per import lib?
    - Ist das ein C interface, oder steckt die Init methode ner C++ classe?
    - Passt die calling convention (auf dll und und exe seite die selbe)?



  • erstmal danke an rapso, denn das problem hat nix mit MFC zu tun, welches ich auch nichtmal verwende ... 🙄

    -> Ich verwende LoadLibraryEx, und nehme GetProcAdress um die CreateDevice() funktion (extern "C"-Funktion) meiner D3D-Kapselung aufzurufen.
    Diese erstellt eine Instanz einer von meinem nach aussen hin sichtbarem Interface abgeleiteten Klasse RendererD3D.

    Das funktioniert, so das Logfile, auch noch super.

    Lediglich die Init Methode ist das Problem
    ->Ja, Init ist eine Methode einer C++ - Klasse

    ->Calling Convention? o_O Was das?
    Die Init Methode wird aufgerufen, auch können die Befehle in der Methode ausgeführt werden und der Rückgabewert passt.
    Lediglich die Parameter die ich an die Funktion übergebe werden beim aufrufen z.B. von (wie oben beschrieben) 800 auf 1464344620 gesetzt 😕

    Ich hoffe jetzt kennt irgendjemand das problem, wäre echt geil.. 😋
    -cyph



  • Kann es sein dass ich die DeviceD3D.lib mitlinken muss?
    Eigentlich will ich ja die DeviceD3D.dll dynamisch laden... 😕



  • Wann muss ich (sowohl bei Funktionen als auch bei Klassen) __declspec(dllimport), wann __declspec(dllexport) und wann extern "C" verwenden? *verwirrt* 😞


Anmelden zum Antworten