DLL - Beispiel aus FAQ



  • Hallo zusammen,
    ich habe ein Problem mit dem DLL - Beispiel aus dem Tutorial.
    Wenn ich eine Klasse erstelle, welche den DLL - Zugriff Kapseln soll, so wie in den FAQ's so stürtzt mir das Programm nach dem erfolgreichen Zugriff auf die DLL-Funktion ab. Ich verdeutliche das am besten mal am Quelltext:
    Das ist die Klasse welche den Zugriff Kapseln soll.

    #include <windows.h>
    //---------------------------------------------------------------------------
    
    class TDLLTest 
    { 
     private:
            typedef int (DLLFUNCTION)(int, int);
            DLLFUNCTION   *pDllFunction;
            HINSTANCE hInstance;
    public:
            TDLLTest();
            ~TDLLTest();
            int CallDllFunction(int iTest1, int iTest2); 
    };
    
    //---------------------------------------------------------------------------
    #endif
    

    Die Implementierung der Methoden sieht folgendermassen aus:

    #include "File1.h"
    //---------------------------------------------------------------------------
    TDLLTest::TDLLTest()
    {
     hInstance = ::LoadLibrary("Project1.dll");
     pDllFunction  = (DLLFUNCTION*)::GetProcAddress((HMODULE)hInstance, "addiere");
    }
    //---------------------------------------------------------------------------
    TDLLTest::~TDLLTest()
    {
     FreeLibrary("Project1.dll");
     hInstance = NULL;
    }
    //---------------------------------------------------------------------------
    int TDLLTest::CallDllFunction(int iTest1, int iTest2)
    {
        int iResult;
        if (pDllFunction)
            iResult = (*pDllFunction)(iTest1, iTest2);
        return iResult;
    }
    

    Das ist alles ja noch recht übersichtlich.
    Der Aufruf erfolgt folgendermassen:

    TDLLTest* DLLTest = new TDLLTest;
     int wert = DLLTest->CallDllFunction(1, 2);
     delete DLLTest;
    

    Die DLL ist in Delphi 6 erstellt und macht nichts anderes als zwei Zahlen zu addieren.
    Wenn ich nun die Funktion aufrufe, so passiert folgendes:

    int TDLLTest::CallDllFunction(int iTest1, int iTest2)
    {
        int iResult;   
        if (pDllFunction)  // sowohl hInstance als auch pDllFunction sind != 0
            iResult = (*pDllFunction)(iTest1, iTest2); //iResult ist hiernach 3 
        return iResult;    
    }   //Builder stürzt ab mit der Fehlermeldung %p ist kein gültiges Argument
    

    Wenn ich das ganze in einer Formulardatei z.B. bei einem Buttonklick ohne die Klasse versuche, funktionierts.
    (Also in dem Event die DLL Lade und die Funktion (*pDllFunction) aufrufe)
    Kann mir dass jemand Erklären?
    Gruss:
    Martin



  • Ist der Funktionszeiger gültig?

    -junix



  • Ja, der ist gültig.
    (Zumindestens hat er einen Wert != 0)
    Die Funktion aus der DLL wird ja auch aufgerufen, der Rückabewert stimmt, und dann erst schiesst sich der Builder ins Nirwana.
    (Er versucht von der Adresse 0x00000004 zu Lesen, warum auch immer)
    Gruss:

    Martin


Anmelden zum Antworten