![]() |
Callback aus einer DLL in eine Klasse einbinden
Moin!
Ich versuche gerade eine DLL eines Zulieferes zu verwenden (ja, wieder einmal :roll:). Dieses Mal arbeitet die DLL mit folgenden Typen:
Delphi-Quellcode:
Meine Klassendefintion sieht wie folgt aus:
TCALLBACK = procedure(Handle, ErrorCode, Transferred: DWORD); cdecl;
PCALLBACK = ^TCALLBACK;
Delphi-Quellcode:
Verusche ich dann wie folgt zu implementieren:
TSteuerung = class(TObject)
private FDB_ID: Integer; FName: string; FChecked: Boolean; FIP: string; Fbeschaeftigt: Boolean; FVersand: TDateTime; FHandle: Cardinal; FBausteine: TBausteinArray; FReadBuffer: TDataArray; FWriteBuffer: TDataArray; FLastError: Integer; FAfterConnect: TNotifyEvent; FAfterWrite: TNotifyEvent; FOnReceive: TNotifyEvent; FOnError: TNotifyEvent; OnOPAConnect: TCallback; //<--- Prozedur soll von der DLL aufgerufen werden dummy: PCALLBACK; //<--- Zeiger auf die Prozedur (zu Testzwecken kurzer Name) . . . public . . . end;
Delphi-Quellcode:
bekomme ich nur "Deklaration von OnOPAConnect unterscheidet sich von vorheriger Deklaration" :wall:
procedure TSteuerung.OnOPAConnect(Handle, ErrorCode, Transferred: DWORD); cdecl;
begin if errorCode = OPA_ERR_NO then begin //erfolgreich verbunden if Assigned(FAfterConnect) then FAfterConnect(self); end else begin FLastError := ErrorCode; if Assigned(FOnError) then FOnError(self); end; end; Wie fülle ich jetzt "OnOPAConnect" mit Leben? Danke im Voraus! |
Re: Callback aus einer DLL in eine Klasse einbinden
OnOPAConnect darf keine Klassenmethode sein, sondern muß eine einfache Prozedur sein. Eine Klassenmethode hat 2*4 Byte als Zeiger: Einmal die Methodeneinsprung und einmal einen Zeiger auf die verwendete Instanz.
|
Re: Callback aus einer DLL in eine Klasse einbinden
Hmm, dann stehe ich vor einem noch größeren Problem. Ich kommuniziere über die DLL mit mehreren Steuerungen und zwar asynchron. Ich schicke also eine Anfrage an eine IP raus und irgendwann erhalte ich eine Antwort. Bei der Antwort erhalte ich aber die IP nicht mit zurück, deswegen wollte ich mir eine Liste mit je einem Objekt pro Steuerung anlegen und die Callbacks der der DLL als Methode des jeweiligen Objekts implementieren, damit ich bei einer Antwort direkt eine Zuordnung habe.
Dann bleibt mir wohl nichts anderes übrig, als die Callbacks außerhalb der Klasse zu implementieren und das richtige Objekt durch iterieren der Liste und vergleichen des Handles zu suchen :shock: Danke für deine Hilfe! |
Re: Callback aus einer DLL in eine Klasse einbinden
Zitat:
|
Re: Callback aus einer DLL in eine Klasse einbinden
Na, dann kann ich ja nicht so dermaßen auf dem Holzweg sein ;-)
|
Re: Callback aus einer DLL in eine Klasse einbinden
stammt die dll von dir? wenn ja könntest du der DLL ja die Objectinstanz mit geben welche dann beim Callback mit zurück gegeben wird.
|
Re: Callback aus einer DLL in eine Klasse einbinden
Ne, leider nicht von mir sondern von einem Hardwarehersteller.
|
Re: Callback aus einer DLL in eine Klasse einbinden
wenn du mit Delphi etwas bewandert bist kannst du auch dynamsich speicher anfordern, dort den ausführbahren Code der Callback-Funktion rein plazieren inclusive der Instanz und von dort aus dann eine Methode des Objectes aufrufen.
Diese Variante sollte man aber nur nutzen wenn man das versteht (also nicht von anderen tippen lassen und nur verwenden) |
Re: Callback aus einer DLL in eine Klasse einbinden
Nee, das lassen wir mal lieber ;) Dann doch lieber die richtige Instanz suchen^^
|
Re: Callback aus einer DLL in eine Klasse einbinden
Es geht, ist aber extrem Tricky.
In ![]() |
Re: Callback aus einer DLL in eine Klasse einbinden
Zitat:
Aber hier würde ich lieber eine neue Klasse schreiben, die nur eine Liste mit der Beziehung Handle<->Objektinstanz beinhaltet. |
Re: Callback aus einer DLL in eine Klasse einbinden
Zitat:
|
Re: Callback aus einer DLL in eine Klasse einbinden
Zitat:
|
Re: Callback aus einer DLL in eine Klasse einbinden
Zitat:
Danke noch mal an alle! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:50 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