Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Wie bekomme ich den Zeiger einer Methode?


MaikRutsche - Di 04.03.03 04:01
Titel: Wie bekomme ich den Zeiger einer Methode?
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:

Quelltext
1:
procedure Callback(I: Integer);                    

Übergeben wollte ich dden Zeiger wie folgt:

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 - Di 04.03.03 14: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:

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:

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 - Di 04.03.03 14: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!


AndyB - Di 04.03.03 14: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:

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.


DaFox - Di 04.03.03 14: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 - Di 04.03.03 16:46

OK danke erstmal ich werde das heute Abend mal probieren...