Exportierte Funktionen einer DLL nutzen



  • Hi @all,

    ich wollt nur ma fragen wie man exportierte Funktionen einer DLL nutzen kann.
    Ich weiß zwar dass man für normale (nicht als exportiert deklarierte) Funktionen in DLLs Headerdateien und Libs braucht um Funktionen/Methoden, Klassen, Strukturen, etc. zu nutzen, aber - _
    wenn ich den Namen der als exportiert deklarierten Funktion in der DLL weiß, aber weder eine (!) Headerdatei noch eine Library für die DLL besitze...hab ich ehrlich gesagt keinen Peil wie ich das machen soll.

    Wäre euch sehr verbunden wenn ihr mir da weiterhelfen könnten. 🙂

    Schönen Gruß an alle
    Xzibit



  • hi,
    mit

    ::LoadLibrary(..)
    

    laedst du die DLL. Du speicherst das zureuckgegebene Handle.
    Dieses übergibst du der Funktion

    ::GetProcAddress(Handle, "NamederFunktion")
    

    zusammen mit dem Namen der Funktion. Du bekommst einen Funktionszeiger auf die entsprechende Funktion in der DLL zurueckgeliefert (musst du noch casten).
    Die Funktion kannst du dann über den Pointer aufrufen.
    Ein Beispiel zur Veranschaulichung:

    int (*Sqr)(int) = NULL;		// einen Funktions Pointer erzeugen: int ist rueckgabewert und auch einziger Paramter
    	Sqr = reinterpret_cast<int (*)(int)>( ::GetProcAddress(hDll, "Sqr") );
    std::cout << Sqr(99);		// Funktion für Berechnung nutzen
    

    Gruss,
    DeSoVoDaMu



  • Hi und vielen Dank für deine Antwort 😉

    jedoch....hab ich den letzten Codeabschnitt nich so richtig verstanden 🙂
    Gut *lol* die 3. und die 1. Zeile des letzten Abschnitts sind einfach zu verstehen aber die zweite...da hast du geschrieben:

    Sqr = reinterpret_cast<int (*)(int)>( ::GetProcAddress(hDll, "Sqr") );
    

    ich kenn mich zwar schon einigermaßen gut mit C++ aus...aber da beissts bei mir aus..._
    Was genau macht denn dieser reinterpreter_cast ? Ich hab in der MSDN nachgeschaut, hab auch was gefunden aber das was drin steht sagt mir ehrlich gesagt nicht viel.

    Wäre echt super nett von dir wenn du mir das erklären könntest
    (musst aber natürlich nicht, wenn du keinen Bock hast _)

    Schönen Gruß
    Xzibit



  • Nun, er ist wohl ein Äquivalent zu dem C-Cast mit den einfachen Klammern um einen Typ z.B. (int)deinezucastenderWert. Diesen solltest du also auch verwenden koennen. Er macht afaik auch nichts anderes, nur unterscheidet man in c++ den static_cast<typ>(variable), den dynamic_cast, den reinterpret_cast und den const_cast. Alle sind speziell für unterscheidliche Zwecke ausgelegt. Man hat diese "neuen" Casts eingeführt, um sie einerseits besser als solche zu erkennen und andererseits Fehler vorzubeugen, da jeder Cast seine spezielle Aufgabe hat. So kann man beim dynamic_cast kontrollieren, ob er erfolgreich war bzw den const_cast nur nutzen um die Konstantheit eines Objekt zu entfernen.

    Aber zurueck zum Thema: in dem obigen Beispiel wird also ein zurueckgegebener Funktionspointer der Funktion GetProcAdress in den entsprechenden Typ deines Pointers gecastet. Der Typ in den der Pointer konvertiert werden soll ist

    int (*)(int)
    

    wenn du nicht verstehst, wie Funktionspointer arbeiten kannst du dich z.B. da http://www.newty.de/fpt/fpt.html mal umschauen.
    Wenn noch Fragen sind, stell sie 😉

    Gruss,
    DeSoVoDaMu

    Edit: überarbeitet 😃



  • ich kenn mich zwar schon einigermaßen gut mit C++ aus

    da hast du dich wohl falsch eingeschätzt.



  • Hi DeSoVoDaMu,

    vielen Dank für die ausführliche Erklärung 🙂
    Ich denke ich hab's verstanden...
    Wusste nur nicht, dass diese Anweisung dem C-Cast gleichkommt, und da ich anfangs auch gar nicht wusste, dass man diese Art von Typumwandlung als Casten bezeichnet;)
    Aber etz müsst ich's kapiert haben

    Schönen Gruß
    Xzibit



  • DeSoVoDaMu schrieb:

    ::LoadLibrary(..)
    

    Wieso ::LoadLibrary(..) aber nicht ::std::cout << "hallo" ? 😃



  • Ich habe mir das irgendwie bei Win API Funktionen so angewoehnt. Ne richtige Begruendung gibts nicht 🙂

    Gruss,
    DeSoVoDaMu


Anmelden zum Antworten