DLL Tut von fatman (F98)



  • 1. Lies hier Abschnitt 2.1
    2. Die frage nach DllInstance war eine von mir formulierte Frage... klar weiss ich dass F98 nach dem Funktionszeiger gefragt hat.

    -junix



  • Aso. Hatte das irgendwie mit Frage 3 in zusammenhang gebracht. Sorry.
    DllInstance = :003D000
    DllFunktion = NULL



  • Ahja, BTW: Wennimmer du irgendwelche Zeiger welche du in dieser Art erhalten hast verwendest (also mit möglichem Rückgabewert NULL) prüfe den Zeiger bevor du ihn verwendest! das ist enorm wichtig.

    Ich frage nochmals: Besitzt DllInstance einen gültigen Wert?

    -junix



  • Öhm...
    KA.
    Weiß nur das er nen WErt hat...
    Woher soll ich wissen ob er gültig ist???
    Wie soll ich das den überprüfen?

    Was ich dann nicht verstehe ist, warum der Code nicht bei mir geht, wenn er bei ihn geht....



  • Also, ich habe mein Beispiel nochmal nachvollzogen. Die DLL wird geladen (DllInstance hat eine gültige Adresse), nur bekommt DllFunktion keine gültige Adresse zugewiesen, ist also NULL.

    Hm.

    Mit der Delphi-DLL funktionierts, mit der vom BCB generierten nicht... 😕



  • Das freut mich das es nicht an mir liegt..
    Schade. ICh habe das auf thebits.org genau auch ein Tut gesehen, da mußt ich mir noch ne DLL namens Nviewlib.dll runterladen, da war auch alles so erklärt wie bei dir, nur das etwas anders war. ICh habe das auf deine dll Tut umgeändert (zugriff auf deine DLL), und das ging auch nicht...

    Wie kann man das den jetzt lösen?



  • Tja, da bin ich mit meinem Latein auch am Ende. Vielleicht sind ja noch ein paar DLL-Meister hier im Forum, die uns da weiterhelfen können ...



  • Versucht doch mal, wenn ihr die Dll mit BCB erstellt habt, statt "Addieren"
    die Funktion "_Addieren" einzubinden.
    Entgegen der Annahme, das extern "C" den Namen der Funktion nicht verändert, steht in eurer DLL tatsächlich nur eine Funktion mit dem Namen "_Addieren".

    Also:

    DllFunktion = (IMPFUNC)GetProcAddress(DllInstance, "Addiere");
    

    Man kann sich das z.B. mit dem Dependency Walker von MS ansehen.
    Da ihr die Funktion über den Namen importieren wollt und nicht über die Ordinalzahl, müsst ihr den Namen so angeben, wie er in der Dll gespeichert ist. Ansonsten wird die Funktion nicht gefunden.



  • Sorry,
    sollte natürlich

    DllFunktion = (IMPFUNC)GetProcAddress(DllInstance, "_Addieren");
    

    hiessen.
    Blödes CutAndPaste...



  • Jaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa!

    Es geht: :p

    [cpp]
    #include <vcl.h>
    #pragma hdrstop
    #include "windows.h" // Wichtig!!
    #include "TestUnit.h"
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent
    Owner) : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    AnsiString DLLFile = "d:\\Borland\\DllTestneu\\Project1.dll";
    DllInstance = NULL;
    if (FileExists(DLLFile))
    if (!DllInstance) DllInstance = LoadLibrary(DLLFile.c_str()); // DLL laden
    if (DllInstance) Form1->Caption = "DLL wurde geladen.";
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button3Click(TObject *Sender)
    {
    if (DllInstance)
    if (FreeLibrary(DllInstance)) DllInstance = NULL; // DLL entladen

    if (!DllInstance) Form1->Caption = "DLL nicht geladen.";
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    // Funktionstyp deklarieren
    typedef int (__stdcall *IMPFUNC) (int, int);

    // Deklaration für die DLL-Funktion
    IMPFUNC DllFunktion;
    int iSumme;

    if (DllInstance)
    {

    // Addresse der Funktion "Addiere" in der DLL herausfinden
    DllFunktion = (IMPFUNC)GetProcAddress(DllInstance, "_Addieren");

    // DLL-Funktion aufrufen,
    // An die DLL werden 2 int-Werte übergeben (aus Edit1 und Edit2)
    // Rückgabewert ist ein int-Wert (Summe)
    iSumme = DllFunktion(Edit1->Text.ToIntDef(0), Edit2->Text.ToIntDef(0));

    Label1->Caption = IntToStr(iSumme);

    }
    else
    {
    Label1->Caption = "Bitte DLL laden!";
    }
    }[/cpp]

    Danke an SilentSurfer für den Tip! 🙂


Anmelden zum Antworten