DLL einbinden



  • Hallo!

    Ich bin noch Anfänger in Sachen DLL-Programmierung und hoffe hier passende Hilfe zu finden. Im Forum selbst habe ich schon ein paar Beiträge gefunden, die mir allerdings nicht viel weiterhelfen konnten, weil ich nicht mal soweit komme.
    Ich suche ist einen kompletten und verständlichen Sourcecode, andem ich nachvollziehen kann wie das funktioniert. Ein weiteres Detail, was nicht unbeachtet bleiben soll, ist das ich eine Dll (nicht unter c++ erstellt, wahrscheinlich Delphi) einbinden möchte, die ich nicht selbst erstellt habe. Deswegen habe ich weder eine cpp noch lib Datei. Das man mit implib eine Lib Datei erzeugen kann weiß ich. Nur weiß ich nicht, wie ich diese in die Borland C++ 4 Umgebung einbinden kann. Aus der DLL heraus wird nur eine Funktion aufgerufen. Diese liefert einen Integerwert zurück.
    Bei meinen bisherigen Versuchen bin ich an der Fehlermeldung "Unresolved external symbol referenced from module" gescheitert.
    Was bedeutet diese Fehlermeldung?
    Ich bedanke mich schonmal im Vorraus bei jedem, der mir bei meinem Problem helfen kann.
    André



  • Folgender Code sollte dir zeigen wie die Sache auch ohne LIB-Datei funktioniert.

    // In Header-Datei
    class TDLLTest
    {
    private:
       typedef int (DLLFUNCTION)(int, int);
    
       DLLFUNCTION   *pDllFunction;
    
    public:
        TDLLTest();
        void CallDllFunction(int iTest1, int iTest2);
    }
    
    // In CPP-Datei
    TDLLTest::TDLLTest()
    {
       HINSTANCE hInstance;
    
       hInstance = ::LoadLibrary("DelphiDLL.dll");
       pDllFunction  = (DLLFUNCTION*)::GetProcAddress((HMODULE)hInstance, "NameOfDllFunction");
    }
    
    void TDLLTest::CallDllFunction(int iTest1, int iTest2)
    {
        int iResult;
    
        if (pDllFunction)
            iResult = (*pDllFunction)(iTest1, iTest2);
    
    }
    

    [ 09.07.2001: Beitrag editiert von: Happy Builder ]



  • Vielen Dank Happy Builder!

    Um Deinen Code compilieren zu können, muß ich noch wissen, welche include Anweisungen ich noch machen muß. Derzeit erhalte ich die Fehlermeldung Undefiniertes Symbol HINSTANCE. Mit der Borland Hilfe kann ich zu diesem Punkt nicht viel mit anfangen.
    André



  • Ich glaube, da mußt du windows.h einbinden.

    Wenn das nicht funktioniert, dann windef.h

    also #include <windows.h> oder #include<windef.h>

    ------------------
    Happy Building
    wünscht
    Happy Builder
    Ein Besuch der sich lohnt: http://www.bcbarena.de



  • Der Schritt hat geklappt nachdem ich nach langem Suchen ein fehlendes Semikolon gefunden hatte.
    Wenn ich jetzt aber in meiner Main Routine die Funktion aus der Dll aufrufen möchte (TDLLTest.CallDllFunction(variablen); ) kommt die Fehlermeldung E2108 Ungültige Verwendung von typedef ‘TDLLTest’. Was könnte ich jetzt falsch gemacht haben?

    Und nochmals Vielen Dank für Deine Mühe.

    André



  • Über

    TDLLTest.CallDllFunction(iTest1, iTest2);

    kannst du die Funktion nicht aufrufen.

    Das geht nur über

    int iResult;
    if (pDllFunction)
    {
    iResult = (*pDllFunction)(iTest1, iTest2);
    }

    Poste doch mal den Code, den du aus meinem Code gemacht hast.

    ------------------
    Happy Building
    wünscht
    Happy Builder
    Ein Besuch der sich lohnt: http://www.bcbarena.de



  • meine CPP Datei

    #include <condefs.h>
    #pragma hdrstop
    
    #include <stdio.h>
    #include <conio.h>
    #include "exe2.h"
    #include <windef.h>
    
    //---------------------------------------------------------------------------
    
    TDLLTest::TDLLTest()
    {
      HINSTANCE hInstance;
      hInstance = ::LoadLibrary("wandel.dll");
      pDllFunction = (DLLFUNCTION*)::GetProcAddress((HMODULE)hInstance, "Konvert (char*,char*,char*,char*)");
    }
    
    void TDLLTest::CallDllFunction(char*,char*,char*,char*)
    {
      int iResult;
      if (pDllFunction)
        iResult = (*pDllFunction)("a01.tif","ausgabe","jpg","90");
      printf(""+iResult);
    }
    
    #pragma argsused
    int main(int argc, char* argv[])
    {
    
      TDLLTest.CallDllFunktion();
    /*Hier wollte ich die Funktion aus der DLL aufrufen.*/
    
      getch();
    
      return 0;
    }
    
    // meine .h Datei
    
    class TDLLTest
    {
    private:
      typedef int (DLLFUNCTION)(char*,char*,char*,char*);
      DLLFUNCTION *pDllFunction;
    public:
      TDLLTest();
      void CallDllFunction(char*,char*,char*,char*);
    };
    

    Der Aufruf soll laut der Beschreibung
    function Konvert(quelle char;ziel char;Typ char;Zusatz char):Integer; stdcall;
    sein.

    Ich hoffe Du kannst mir bei meinem Problem helfen. Wahrscheinlich sehe ich schon die einfachsten Dinge nicht mehr. Sitze schon seit ein paar Tagen an diesem Problem.

    Danke!

    André

    [ Dieser Beitrag wurde am 17.09.2002 um 21:24 Uhr von Jansen editiert. ]



  • Drei Fehler sind mir aufgefallen.
    [cpp]TDLLTest::TDLLTest()
    {
    HINSTANCE hInstance;
    hInstance = ::LoadLibrary("wandel.dll");
    pDllFunction = (DLLFUNCTION*)::GetProcAddress((HMODULE)hInstance, "Konvert");
    }

    void TDLLTest::CallDllFunction**()**
    {
    int iResult;
    if (pDllFunction)
    iResult = (*pDllFunction)("a01.tif","ausgabe","jpg","90");
    printf(""+iResult);
    }

    #pragma argsused
    int main(int argc, char* argv[])
    {
    TDLLTest DllTest;

    DLLTest.CallDllFunktion();

    getch();

    return 0;
    }

    //In der H-Datei
    class TDLLTest
    {
    private:
    typedef int (DLLFUNCTION)(char*,char*,char*,char*);
    DLLFUNCTION pDllFunction;
    public:
    TDLLTest();
    void CallDllFunction
    *()**;
    };[/cpp]

    [ Dieser Beitrag wurde am 17.09.2002 um 21:27 Uhr von Jansen editiert. ]



  • Ich habe mich erstmal registriert und möchte Dir ganz herzlich danken, daß Du mir bei diesem Problem geholfen hast. Es funktioniert alles so, wie ich es wollte und so langsam verstehe ich auch was in Deinem Quellcode passiert

    Danke!
    André


Anmelden zum Antworten