![]() |
DLLs erstellen und in Programm einbauen
Hallo,
ich habe eine DLL erstellt und würde diese jetzt gerne in ein Programm einbinden, kann mir jemand helfen und sagen, wie das funktioniert? Hier der Code meine DLL:
Delphi-Quellcode:
rechnen.pas
library rechne;
uses SysUtils, Classes, rechnen in 'rechnen.pas'; {$R *.res} exports addiere; exports subtrahieren; begin end.
Delphi-Quellcode:
Danke.
unit rechnen;
interface function addiere(zahl1, zahl2: integer): integer; stdcall; function subtrahieren(zahl1, zahl2: Integer): Integer; stdcall; implementation function addiere(zahl1, zahl2: integer): integer; stdcall; begin result := zahl1 + zahl2; end; function subtrahieren(zahl1, zahl2: Integer): Integer; stdcall; begin Result := zahl1 - zahl2; end; end. Gruß, Schnittcher |
Re: DLLs erstellen und in Programm einbauen
|
Re: DLLs erstellen und in Programm einbauen
Hallo,
vielleicht hätte ich dazu sagen sollen, dass ich nach dem Tutorial ![]() Gruß, Schnittcher |
Re: DLLs erstellen und in Programm einbauen
|
Re: DLLs erstellen und in Programm einbauen
Hallo,
ja das wäre wenn das Programm gestartet wird, ich wollte es aber gerne so haben, das die Datei nur eingebunden wird und geladen wird, wenn sie benötigt wird. Oder habe ich da etwas falsch verstanden? Gruß, Schnittcher |
Re: DLLs erstellen und in Programm einbauen
ich dachte erst du hast hiernach
![]() gearbeitet, denn dort steht wirklich nichts über das Einbinden :shock: Zitat:
|
Re: DLLs erstellen und in Programm einbauen
Hallo,
ja das habe ich auch gelesen, doch bei "ExtractFilePath" erhalte ich immer einen Fehler, dass er die Funktion nicht kennt. Ich habe in den uses Bereich windows mit eingebunden und alles so gemacht wie es dort steht. Gruß, Schnittcher |
Re: DLLs erstellen und in Programm einbauen
Wie wäre es damit mal die Hilfe für die Funktion aufzurufen, nachzuschauen in welcher Unit sich die Funktion befindet und die Unit dann einzubinden? Kleiner Tipp: In der Windows Unit befindet sich die Funktion nämlich nicht ;).
|
Re: DLLs erstellen und in Programm einbauen
Hallo,
okay danke. Sysutils :) Ich vergesse öfter einfach zu gucken, wo was liegt. Danke. Gruß, Schnittcher |
Re: DLLs erstellen und in Programm einbauen
Hallo,
ich habe es jetzt geschafft die Datei einzubinden. Hier der Code:
Delphi-Quellcode:
unit rechner;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, rechnen; type TForm1 = class(TForm) cmdGo: TButton; edZahl1: TEdit; edZahl2: TEdit; lblErgebnis: TLabel; procedure cmdGoClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.cmdGoClick(Sender: TObject); var zahl1, zahl2: integer; begin zahl1 := strtoint(edZahl1.Text); zahl2 := strtoint(edZahl2.Text); lblergebnis.Caption := inttostr(rechnen.addieren(zahl1, zahl2)); end; end.
Delphi-Quellcode:
Aber egal welche Zahlen ich zum addieren eingebe, ich bekomme immer: 4475786 als Ergebnis.
unit rechnen;
interface uses windows, sysutils; type TSummenFunktion = function(zahl1, zahl2: integer): integer; stdcall; // TDifferenzFunktion = function(zahl1, zahl2: integer): integer; stdcall; function addieren(zahl1, zahl2: integer): integer; //function subtrahieren(zahl1, zahl2: integer): integer; implementation function addieren(zahl1, zahl2: integer): integer; var SummenFunktion: TSummenFunktion; Handle: THandle; begin Handle := LoadLibrary(PChar(ExtractFilePath(ParamStr(0)) + 'rechne.dll')); if Handle <> 0 then begin @SummenFunktion := GetProcAddress(Handle, 'addieren'); if @SummenFunktion <> nil then begin result := SummenFunktion(zahl1, zahl2); end; FreeLibrary(Handle); end; end; end. Kann mir jemand sagen wieso? Edit: fehler gefunden.
Delphi-Quellcode:
muss so aussehen:
@SummenFunktion := GetProcAddress(Handle, 'addieren');
Delphi-Quellcode:
Aber kann mir jemand sagen wofür das @ bei "@SummenFunktion" steht?
@SummenFunktion := GetProcAddress(Handle, 'addiere');
Gruß, Schnittcher |
Re: DLLs erstellen und in Programm einbauen
@ sagt, daß du en Zeiger dieser Variable setzen willst, was aber zum Zuweisen nicht nötig ist,
da Delphi dort weiß, daß du den Zeiger setzen willst, weil ja nichts anderes möglich wäre.
Delphi-Quellcode:
beim Auslesen ist es aber wichtig
SummenFunktion := GetProcAddress(Handle, 'addieren');
Delphi-Quellcode:
Folgendes wöllte die Funktion aufrufen und das ergebnis mit NIL vergleichen,
if @SummenFunktion <> nil then
wobei hier natürlich der Kompiler die fehlenden Parameter bemeckert (aber wenn es keine Parameter gäbe ...)
Delphi-Quellcode:
Wegen deinem "ich bekomme immer: 4475786" hätte ich Debuggen vorgeschlagen,
if SummenFunktion <> nil then
dann wäre dir aufgefallen sofort, daß die Funktion nicht ausgeführt wurde. Und es kann nicht schaden, wenn das Einbinden der DLL und Funktion nicht nur geprüft und behandelt würde.
Delphi-Quellcode:
function addieren(zahl1, zahl2: integer): integer;
var SummenFunktion: TSummenFunktion; Handle: THandle; begin Handle := LoadLibrary(PChar(ExtractFilePath(ParamStr(0)) + 'rechne.dll')); if Handle <> 0 then begin try SummenFunktion := GetProcAddress(Handle, 'addiere'); if Assigned(SummenFunktion) then begin result := SummenFunktion(zahl1, zahl2); end else Result := 0; // oder besser noch 'ne Fehlermeldung oder Exception auslösen finally // >>> funktion "addiere" wurde nicht gefunden <<< FreeLibrary(Handle); end; end else Result := 0; // oder besser noch 'ne Fehlermeldung oder Exception auslösen end; // >>> DLL wurde nicht geladen <<<
Delphi-Quellcode:
function addieren(zahl1, zahl2: integer): integer;
var SummenFunktion: TSummenFunktion; Handle: THandle; begin Handle := LoadLibrary(PChar(ExtractFilePath(ParamStr(0)) + 'rechne.dll')); try SummenFunktion := GetProcAddress(Handle, 'addiere'); if (Handle <> 0) and Assigned(SummenFunktion) then begin result := SummenFunktion(zahl1, zahl2); end else Result := 0; // oder besser noch 'ne Fehlermeldung oder Exception auslösen finally // >>> funktion "addiere" wurde nicht gefunden <<< FreeLibrary(Handle); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz