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
Tino: 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...
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!