![]() |
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). |
Re: self Pointer an C Funktionen weitergeben
Eine Instanzvariable ist schon ein Pointer.
|
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.
|
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?
|
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.
|
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; |
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?
|
Re: self Pointer an C Funktionen weitergeben
Also ich habe bei EnumWindows das so gemacht:
Delphi-Quellcode:
Also nach Integer gecastet. Vll. löst das das Problem ;)
function EnumWindowCallback(hwnd: HWND; Form: TForm1): LongBool; stdcall;
begin // code end; function TForm1.InsertButton(): Boolean; begin EnumWindows(@EnumWindowCallback, Integer(self)); end; |
Re: self Pointer an C Funktionen weitergeben
Sehr gut, mit Pointer() hat's dann funktioniert, danke :)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz