elvira: C/C++ - DLL einbinden

Hallo an alle :)
Ich bin blutige Anfaengerin in Umgang mit DLLs und soll
nun in einem C-Programm Funktionen aufrufen die in einer
DLL stehen. Ich weiss nicht ob ich einfach nur auf der
Leitung stehe oder es irgendwie einfach nicht kapiere.
Wie muss ich denn mein Makefile gestalten? Ich kann dann
doch ohne weitere Probleme die Funktionen aufrufen oder muss ich doch extra Funktionen anwenden die erstmal die DLL einbinden? Ich lese so viel wiederspruechliches.
Ich bin fuer jede Hilfe dankbar!

Gruesse
Elvira

  1. hi!

    Ich bin blutige Anfaengerin in Umgang mit DLLs und soll
    nun in einem C-Programm Funktionen aufrufen die in einer
    DLL stehen. Ich weiss nicht ob ich einfach nur auf der
    Leitung stehe oder es irgendwie einfach nicht kapiere.
    Wie muss ich denn mein Makefile gestalten? Ich kann dann
    doch ohne weitere Probleme die Funktionen aufrufen oder muss ich
    doch extra Funktionen anwenden die erstmal die DLL einbinden? Ich
    lese so viel wiederspruechliches.

    Es gibt zwei Methoden, Funktionen aus einer DLL aufzurufen: implizit
    oder explizit.

    Bei der impliziten Methode brauchst du eine Headerdatei für die DLL,
    in der ein Prototyp aller exportierten Funktionen dieser DLL steht.
    Bei dieser Methode muss die DLL allerdings schon während der Compile-
    Zeit vorhanden sein.

    Bei der expliziten Methode kannst du die DLLs nachträglich hinzufügen
    (zb. für Plugins), dafür ist die Verwendung etwas komplizierter:

    Angenommen, du hast folgende - einfache aber sinnlose - Funktion in
    deiner DLL stehen (MS VC++):

    extern "C" __declspec(dllexport) int getInt(int i);
    {
      return
    }

    Diese Funktion kannst du dann etwa folgendermaßen verwenden:

    HMODULE handle;
    handle = LoadLibrary("test.dll");
    if (handle != NULL)
    {
      typedef int (*DLLFUNC)(int);
      DLLFUNC func = (DLLFUNC)GetProcAddress(handle, "getInt");
      if (func)
      {
        int i = func(42);
      }
    }
    FreeLibrary(handle);

    Sieht wohl auf den ersten Blick recht kompliziert aus, da gewöhnt man
    sich aber dran:

    LoadLibrary("test.dll");
      Lädt die DLL in den Speicher und gibt ein Handle zurück.

    typedef int (*DLLFUNC)(int);
      Keine Ahnung, wie die Zeile genau funktioniert. Damit definierst du
      aber einen Zeiger auf eine Funktion, die einen Parameter vom Typ
      int erwartet und einen int zurückgibt.

    (DLLFUNC)GetProcAddress(handle, "getInt");
      Gibt einen Funktionszeiger vom Typ DLLFUNC (s.o.) auf die Funktion
      getInt aus der geladenen DLL zurück, der später verwendet wird, um
      die Funktion auszuführen.

    int i = func(42);
      Ruft die Funktion getInt über den Funktionszeiger func auf, der von
      GetProcAddress() zurückgegeben wurde.

    Implizit habe ich noch keine DLL verwendet, kann ich dir also nichts
    genaueres drüber sagen. Aber in Microsofts MSDN findest du sicher was
    zu diesem Thema:
      http://msdn.microsoft.com/
      http://msdn.microsoft.com/library/techart/dlldynamic.htm
    Allerdings wirst du da sicher noch mehr finden. Viel Glück ;)

    bye, Frank!

    1. Hi Frank :)

      So nach Tagen mit Terminstress (Du kannst Dir vorstellen das ich nicht ganz freiwillig am Sonntag an diesen Problemen gearbeitet
      habe ;)) kann ich mich endlich gebuehrend bei Dir bedanken.
      Du hast mir super weitergeholfen.
      Als ich Deine Antwort gelesen habe, kam der beruehmte "Aha"-Effekt und alles gab' einen Sinn.

      Vielen vielen Dank fuer Deine Muehe. :)

      Mit dunklen Gruessen
      Elvira

  2. Hi Elvira,

    wie Frank gesagt hat, es gibt zwei Methoden. Einmal implizit, das ist die in den meisten Fällen verwendete Methode. Dafür musst du nur die nötige Headerdatei einbinden, und beim Linken die hoffentlich vorhandene Import-Library dazu linken. Dann explizit, dass ist der Weg, den Frank beschrieben hat.

    Beides ist nicht so schwer, es erfordert nur eine gewisse Eingewöhnung. Im Prinzip machst du bisher nichts anderes, denn sämtliche Windows-Funktionen (es geht doch um Windows, oder?) sind in DLLs vorhanden. Dass die Endung Exe verwendet wird tu dem keinen Abbruch.

    Wie muss ich denn mein Makefile gestalten?

    Tja, das kommt auf deinen Compiler an. Wenn es der MS Visual C++ Compiler ist, musst du nicht viel machen. Die Headerdatei in die C-Datei mit #include einfügen, in der die Funktionen verwendet werden sollen, und in den Project Settings auf der Seite "Link" die nötige Importlib angeben.

    That's all.

    Gruß,
    Martin