Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Callback aus einer DLL in eine Klasse einbinden (https://www.delphipraxis.net/106057-callback-aus-einer-dll-eine-klasse-einbinden.html)

Thanatos81 4. Jan 2008 13:53


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:
  TCALLBACK = procedure(Handle, ErrorCode, Transferred: DWORD); cdecl;
  PCALLBACK = ^TCALLBACK;
Meine Klassendefintion sieht wie folgt aus:
Delphi-Quellcode:
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;
Verusche ich dann wie folgt zu implementieren:
Delphi-Quellcode:
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;
bekomme ich nur "Deklaration von OnOPAConnect unterscheidet sich von vorheriger Deklaration" :wall:
Wie fülle ich jetzt "OnOPAConnect" mit Leben?

Danke im Voraus!

Bernhard Geyer 4. Jan 2008 14:09

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.

Thanatos81 4. Jan 2008 14:15

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!

Bernhard Geyer 4. Jan 2008 14:47

Re: Callback aus einer DLL in eine Klasse einbinden
 
Zitat:

Zitat von Thanatos81
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:

Genau das wollte ich auch vorschlagen nachdem du erklärt hast was du machen willst.

Thanatos81 4. Jan 2008 14:53

Re: Callback aus einer DLL in eine Klasse einbinden
 
Na, dann kann ich ja nicht so dermaßen auf dem Holzweg sein ;-)

SirThornberry 4. Jan 2008 15:08

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.

Thanatos81 4. Jan 2008 15:09

Re: Callback aus einer DLL in eine Klasse einbinden
 
Ne, leider nicht von mir sondern von einem Hardwarehersteller.

SirThornberry 4. Jan 2008 15:11

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)

Thanatos81 4. Jan 2008 15:19

Re: Callback aus einer DLL in eine Klasse einbinden
 
Nee, das lassen wir mal lieber ;) Dann doch lieber die richtige Instanz suchen^^

Phoenix 4. Jan 2008 15:44

Re: Callback aus einer DLL in eine Klasse einbinden
 
Es geht, ist aber extrem Tricky.

In diesem Thread hier hatte ich damals das gleiche Problem, nämlich ein Callback auf eine Klassenmethode zu setzen. Es ging hier um Service. Unten ist meine Lösung, schau mal nach MakeProcInstance. Das ist das was Du suchst.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:36 Uhr.
Seite 1 von 2  1 2      

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