Autor Beitrag
MaikRutsche
Hält's aus hier
Beiträge: 6


D6
BeitragVerfasst: Di 04.03.03 03:01 
Hallo,

ich habe hier grade ein kleines Problem.

Ich möchte einer DLL den Zeiger einer Methode übergeben damit diese von der DLL ausgeführt werden kann.

Bsp:
ausblenden Quelltext
1:
procedure Callback(I: Integer);					

Übergeben wollte ich dden Zeiger wie folgt:
ausblenden Quelltext
1:
setcallbackftn(@Callback);					

Sobald die Prozedur aber zu einer Klasse gehört bekomme ich den Fehler:
"Variable erforderlich".

Hat jemand ne Idee?
Oder wie ich am besten einer DLL sage: "Hier wenn was ist dann rufe diese Funktion auf".


MfG

Maik

Moderiert von user profile iconTino: Code-Tags hinzugefügt.
DaFox
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189



BeitragVerfasst: Di 04.03.03 13:03 
Hi!

Wenn ich das richtig überblicke, liegt der Fehler woanders. So wie Du es beschreibst sollte nämlich alles in Ordnung sein.
Überprüfe einfach mal, ob Du nach diesem Schema vorgehst:

DLL:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
type
  TCallback = procedure(I: integer); stdcall;

var
  CallbackProc: TCallback = nil;

procedure setcallbackftn(aProc: TCallback); stdcall; export;
begin
  if assigned(aProc) then CallbackProc := aProc;
end;


EXE:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
type
  TCallback = procedure(I: integer); stdcall;

  procedure setcallbackftn(aProc: TCallback); stdcall; external 'mydll.dll';

procedure myCallback(I: integer); stdcall;
begin
  ShowMessage(IntToStr(i));
end;

...

setcallbackftn(@myCallback);


Gruß,
Markus
Andreas Pfau
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 997



BeitragVerfasst: Di 04.03.03 13:20 
Ganz wichtig: Die Methode darf nicht in einer Klasse deklariert sein!!!

Es lange, wenn du die MEthode in implementation schreibst und mit @ referenzierst. Nur darf eben nicht sonstwo eine Deklaration stehen, also keine Methoden wie "TForm1.DoSomething()" mit @ übergeben!

_________________
Life is a bad adventure, but the graphic is really good!
AndyB
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1173
Erhaltene Danke: 14


RAD Studio XE2
BeitragVerfasst: Di 04.03.03 13:23 
@DaFox:
Zitat:
Sobald die Prozedur aber zu einer Klasse gehört


@MaikRutsche:
Hast du den DLL Code selbst geschrieben, oder nicht? Wenn du ihn selbst geschrieben hast, dann musst du ihn so anpassen:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
DLL:
type
  TMyMethod = procedure(i: Integer) of object; // das "of object" ist wichtig

procedure SetCallbackFtn(cb: TMyMethod);
begin
  cb(10);
end;


EXE:
type
  TMyMethod = procedure(i: Integer) of object; // das "of object" ist wichtig

  TForm1 = class(...)
  ...
    procedure Callback(i: Integer);
  end;

procedure SetCallbackFtn(cb: TMyMethod); external 'irgendwas.dll';
...

procedure TForm1.Button1Click(...)
begin
  SetCallbackFtn(Callback);
end;



Wenn die DLL nicht verändert werden kann, so ist es nicht möglich ihr eine Method zu übergeben, da Methoden einen versteckten Parameter (Self) haben.

_________________
Ist Zeit wirklich Geld?
DaFox
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189



BeitragVerfasst: Di 04.03.03 13:37 
Sorry, überlesen.
Andy hat natürlich recht. Mein Beispiel bezog sich auf eine standalone function. Wie mein Vorredner bereits erwähnt hat, muss bei einer Methode aber noch der hidden parameter (eine Referenz auf die Instanz der Klasse) berücksichtigt werden.

Gruß,
Markus
MaikRutsche Threadstarter
Hält's aus hier
Beiträge: 6


D6
BeitragVerfasst: Di 04.03.03 15:46 
OK danke erstmal ich werde das heute Abend mal probieren...