Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi self Pointer an C Funktionen weitergeben (https://www.delphipraxis.net/123935-self-pointer-c-funktionen-weitergeben.html)

cytrinox 11. Nov 2008 15:32


self Pointer an C Funktionen weitergeben
 
Hi,


ich binde eine C-DLL Datei mit ins Projekt ein. Eine Funktion davon erwartet eine Callback-Funktion (hierfür hab ich eine Delphi Funktion geschrieben) und ein void* als Argument für die Callback-Funktion.

Schreib ich: dll_function(@my_callback, PAnsiChar('foobar')); wird my_callback(arg) aufgerufen und ich kann mit ShowMessage den Sring ausgeben.


Allerdings rufe ich dll_function aus einer Methode eines Objektes heraus auf und möchte self als arg übergeben und im my_callback() dann arg casten und eine bestimmte methode davon aufrufen (z.B. ClassName).

Genau das funktioniet aber nicht. Ich schreibe dll_function(@my_callback, Addr(self)); und my_callback sieht so aus:


function my_callback(arg: Pointer): Integer; cdecl;
var
obj: ^MyClass;
begin
obj = arg;
ShowMessage(obj.className); // Zeichenwirrwarr oder Access violation
end;

Wie muss ich nun arg casten damit ich damit arbeiten kann, denn offensichtlich stimmt irgendwas mit dem Pointer nicht.
Ich hab sämtliche Kombinationen von @x,Addr(x) ^x und x^ nun durch aber nichts funktioniert - lediglich die PansiChar sache klappt.

Ist self überhaupt ein Object oder ist das schon ein Pointer? (In C++ ist this ja z.B. auch ein Pointer).

DeddyH 11. Nov 2008 15:34

Re: self Pointer an C Funktionen weitergeben
 
Eine Instanzvariable ist schon ein Pointer.

Apollonius 11. Nov 2008 15:37

Re: self Pointer an C Funktionen weitergeben
 
Die Adresse von Self wird ungültig, wenn die Methode verlassen wird. Du solltest direkt Pointer(Self) übergeben.

cytrinox 11. Nov 2008 16:10

Re: self Pointer an C Funktionen weitergeben
 
IEEKS. Lasst mich raten: self liegt auf dem Stack und Addr(self) gibt mir nen Pointer in den Stack zurück?

Apollonius 11. Nov 2008 16:16

Re: self Pointer an C Funktionen weitergeben
 
Exakt. Wenn du eine Adresse nimmst, zwingst du Delphi, die Variable oder den Parameter auf dem Stack abzulegen.

shmia 11. Nov 2008 16:18

Re: self Pointer an C Funktionen weitergeben
 
Delphi-Quellcode:
function my_callback(arg: Pointer): Integer; cdecl;
var
obj: TMyClass;
begin
  obj = TMyClass(arg);
  ShowMessage(obj.className);
  obj.IrgendNeMethode;
end;

cytrinox 11. Nov 2008 16:26

Re: self Pointer an C Funktionen weitergeben
 
Hmm und was macht Pointer() genau? Denn einfach nur self direkt übergeben produziert den/die selben Fehler und Pointer() castet doch einfach nur?

jfheins 11. Nov 2008 16:31

Re: self Pointer an C Funktionen weitergeben
 
Also ich habe bei EnumWindows das so gemacht:
Delphi-Quellcode:
function EnumWindowCallback(hwnd: HWND; Form: TForm1): LongBool; stdcall;
begin
 // code
end;

function TForm1.InsertButton(): Boolean;
begin
  EnumWindows(@EnumWindowCallback, Integer(self));
end;
Also nach Integer gecastet. Vll. löst das das Problem ;)

cytrinox 12. Nov 2008 10:57

Re: self Pointer an C Funktionen weitergeben
 
Sehr gut, mit Pointer() hat's dann funktioniert, danke :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:30 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz