Announcement

Collapse
No announcement yet.

Unerklärlicher fehler bei dyn. DLL-Aufruf

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Unerklärlicher fehler bei dyn. DLL-Aufruf

    Hallo,

    bei meinen versuchen mit DLL's habe ich das Tutorial auf http://www.tutorials.delphi-source.de/dlls/index.shtml mal nachgebaut.

    Die statische Variante funktioniert einwandfrei. Variable 1 und 2 werden vernünftig addiert. Dynamisch sieht mein Quelltext so aus:

    unit dllunit;
    interface
    uses windows;
    type
    TSummenFunktion = function(zahl1, zahl2: integer): integer;
    function addieren(zahl1, zahl2: integer): integer;
    implementation

    function addieren(zahl1, zahl2: integer): integer;
    var SummenFunktion: TSummenFunktion;
    Handle: THandle;
    begin
    Handle:=LoadLibrary('rechnen.dll');
    if Handle <> 0 then
    begin
    @SummenFunktion := GetProcAddress(Handle, 'addiere');
    if @SummenFunktion <> nil then
    begin
    showmessage(inttostr(SummenFunktion(zahl1, zahl2)));
    result:=SummenFunktion(zahl1, zahl2);
    end;
    FreeLibrary( Handle );
    end;
    end;
    end.

    Das Problem:
    Nach dem Aufruf der Funktion addieren bricht das Programm ab und ich habe ein CPU-Fenster mit diversen Schutzverletzungen vor mir. Durch das showmessage habe ich festgestellt das das Ergebnis falsch ist und er bei freelib. die Schutzverletzung auftritt.
    Wie gesagt, wenn ich die DLL statisch einbinde funktioniert alles.
    Ich benutze Delphi 7 pro.

    Vielen Dank!

    Bye,

    Sebastian

  • #2
    Hallo,

    &gt;..Aufruf der Funktion addieren bricht das Programm ab ...

    dies deutet darauf hin, dass die in der DLL deklarierte Aufrufkonvention (register, pascal, cdecl, stdcall oder safecall) nicht mit der im Program deklarierten Aufrufkonvention übereinstimmt. Der folgende Satz stammt aus der Delphi-Hilfe: "<i>Aufrufkonventionen bestimmen die Reihenfolge, in der Parameter an die Routine übergeben werden. Sie beeinflussen außerdem das Entfernen der Parameter vom Stack, den Einsatz der Register zur Übergabe von Parametern sowie die Fehler- und Exception-Behandlung. Die Standard-Aufrufkonvention ist <b>register</b>.</i>".

    &gt;Die statische Variante funktioniert einwandfrei.

    Wird dort die von der DLL exportierte Funktion anders deklariert als beim dynamischen Import? Wie sieht ein minimales vollständiges Beispiel (DLL + Programm) aus, mit dem sich dieses Problem jederzeit reproduzieren lässt?

    Wenn es bei der Deklaration keine Unterschiede gibt, was passiert beim folgenden Aufruf:
    <pre>
    unit dllunit;

    interface

    uses windows;

    type
    TSummenFunktion = function(zahl1, zahl2: integer): integer;

    var
    SummenFunktion: TSummenFunktion;

    function addieren(zahl1, zahl2: integer): integer;

    implementation

    function addieren(zahl1, zahl2: integer): integer;
    Handle: THandle;
    begin
    Handle:=LoadLibrary('rechnen.dll');
    if Handle <> 0 then
    begin
    @SummenFunktion := GetProcAddress(Handle, 'addiere');
    if @SummenFunktion <> nil then
    begin
    showmessage(inttostr(SummenFunktion(zahl1, zahl2)));
    result:=SummenFunktion(zahl1, zahl2);
    end;
    FreeLibrary( Handle );
    end;
    end;

    end.
    </pre>
    &#10

    Comment

    Working...
    X