explicites laden( GetProcAddress und so ) einer Dll, auch ohne Def Datei möglich?



  • Hallo nach mal ich bin immer noch mit .dlls beschäftigt und wollte mal fragen ob explizites laden von .dlls auch ohne .def Date möglich ist.
    Da in meinem Software Project sich einige .dlls befinden, die auch sehr oft verändert und ergänzt werden, weshalb ich darauf verzichten möchte noch mehr Datein verwalten zu müssen.

    Danke für eure hilfe,
    Mojo



  • DEF-Dateien haben *nix* mit GetProcAddress zu tun.

    Du brauchst nur den Namen...

    Ok, der Name mag vielleich durch eine DEF-Datei beeinflussbar sein 😉



  • Ok das ist schon mal gut zu wissen. Danke.
    Aber leider löst das mein Problem nicht, da GetProcAdress meine Funktion nicht findet, bzw nur Nullen übergibt, wenn ich nach der einzigen Funktion in meiner dll suche.



  • Dann schau mal nach, wie die Funktionen in der DLL den *wirklich* heissen!!!

    http://www.dependecywalker.com/



  • Hier erstmal ein unverzichtliches Tool wenns um DLLs geht:

    http://www.dependencywalker.com/

    Damit kannst du gucken wie die Funktion heisst.
    Davon abgesehen, wenn du ohne ein .def File eine Funktion exportieren willst versuch es so:

    extern "C" void __declspec(dllexport) foo();
    

    Das führt IIRC zu einem Export der einfach "_foo" heisst.
    Dabei ist egal was für Parameter oder Returntyp die Funktion hat.

    p.S.: foo darf natürlich nicht überladen sein.



  • Tja leider ist das aber mein Firmenrechner auf dem darf ich leider keine „fremde“ Software installieren.
    Aber da ich die Dll selber geschrieben habe, und ich die exportierte Funktion denn noch nicht ansprechen kann kannst du mir nicht verraten wie man den Namen denn noch heraus bekommen kann? Ich meine wenn es da eine Möglichkeit gibt.

    hustbaer schrieb:

    extern "C" void __declspec(dllexport) foo();
    

    Aber das hier werde Ich am Montag gleich als erstes ausprobieren
    Danke!


  • Mod

    1. Der Dependency Walker gehört auch zum VS!
    2. Wenn Du die DLL geschrieben hast, hast Du doch selbst festgelegt, was exportiert wird, oder?



  • So wieder an der Arbeit…
    also das „extern“ hatte ich tatsächlich vergessen genau so wie das “C“.
    Jetzt funktioniert es auch. Hurra und ein dickes Danke! 👍
    Jetzt muss ich nur noch wissen wie das „C“ hinter dem „extern“ definiert ist und ob das auch mit C++ Dlls funktioniert.
    Ich würde mich freuen wenn ihr mir da noch mal helfen könntet.



  • Jetzt muss ich nur noch wissen wie das „C“ hinter dem „extern“ definiert ist

    Unter C++ gibt es so Spaesse wie Funktionsueberladung. Der Compiler muss diese Funktionen (die im Quellcode ja den gleichen Namen haben) irgendwie eindeutig in der Binaerdatei ablegen. Jeder Compiler hat so seinen eigenen Algorithmus, um die Namen eindeutig zu machen (Name mangling genannt).
    extern "C" besagt, dass das Name mangling abgeschalten wird fuer diese Funktion und sie ganz normal wie eine C-Funktion benannt wird.

    und ob das auch mit C++ Dlls funktioniert

    Genaugenommen macht es nur bei C++ DLLs Sinn. C DLL haben per Definition eine C-Schnittstelle (klingt logisch oder?) und damit keine verstuemmelten Namen.



  • Dann habe ich mir mal wieder zu viele Gedanken gemacht.
    Danke!


Anmelden zum Antworten