Autor Beitrag
Peti
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 42



BeitragVerfasst: Mi 17.09.03 09:02 
Hallo zusammen,

ich habe ein kleines (Anfänger-)Problem mit DLLs. Ich arbeite zum ersten Mal mit DLLs, da ich bisher nie DLLs benutzt habe.

Ich habe mir schon diverse Tutorials durchgelesen, aber das einfachste Testprogramm gibt bei mir eine Zugriffsverletzung, die ich einfach nicht verstehe.

Hier mal der Code aus dem Tutorium:

DLL:
[delph]
library TestDLLProjekt;

uses
SysUtils,
Classes;

{$R *.res}

function addiere(zahl1, zahl2: integer): integer; stdcall;
begin
addiere:=zahl1+zahl2;
end;

exports
addiere;

end.
[/delph]

Und das Test-Projekt dazu:

[delph]
unit TestDLL_EXE_Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;

var
Form1: TForm1;

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

implementation

{$R *.dfm}

function addieren(zahl1, zahl2: integer): integer;
var SummenFunktion: TSummenFunktion;
Handle: THandle;
Summe:Integer;
begin
Handle:=LoadLibrary(PChar(ExtractFilePath(ParamStr(0))+'TestDLLProjekt.dll'));
if Handle <> 0 then
begin
@SummenFunktion := GetProcAddress(Handle,'addiere');
if @SummenFunktion <> nil then
begin
Result:=SummenFunktion(1,12);
end;
FreeLibrary(Handle);
end;
Result:=Summe;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Label1.Caption:=IntToStr(addieren(3,5));
end;

end.
[/delph]

Zunächst mal habe ich die DLL compiliert, die auch erfolgreich erzeugt wurde.
Wenn ich aber mein Testprojekt dann ausführe und die Addition per Buttonclick ausführe, erhält die Summe utopische Werte und ich erhalte eine Access-Violation.

Hat jemand einen Rat, was für einen blöden Fehler ich da mache?

Liebe Grüße und
vielen Dank schonmal vorab,

Peti

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 17.09.03 10:33 
Deine Funktion addiere in der Unit der Anwendung ist Blödsinn, wenn ich das richtig sehe. Lad die DLL und weiß dem Prototypen der Funktion die Adresse aus der DLL im OnCreate-Ereignis zu.

Ein ausführliches DLL Tutorial findest du hier: www.luckie-online.de...orials/win32apituts/ .
Peti Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 42



BeitragVerfasst: Mi 17.09.03 10:38 
Titel: Hmm...
Hi Luckie,

mich wundert allerdings, dass ich dieses Beispiel in identischer Form in verschiedenen Tutorials exakt so gefunden habe....

Naja, ich werde mir mal das von Dir angegebene reinziehen... :wink:

Danke für den Tip,
Gruß,
Peti