Delphi-PRAXiS

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.

sirius 4. Jan 2008 15:52

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

Zitat von Phoenix
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.

Aber mit getmem Speicher zu alloziieren, welcher ausgeführt werden soll, ist nicht so toll. Das steht in anderen Threads besser (virtualalloc, virtualfree).

Aber hier würde ich lieber eine neue Klasse schreiben, die nur eine Liste mit der Beziehung Handle<->Objektinstanz beinhaltet.

Bernhard Geyer 4. Jan 2008 16:07

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

Zitat von sirius
Aber mit getmem Speicher zu alloziieren, welcher ausgeführt werden soll, ist nicht so toll. Das steht in anderen Threads besser (virtualalloc, virtualfree).

Was sagt den der Speicherschutz von XP/Vista dazu bzw. Viren-Scanner?

Muetze1 4. Jan 2008 16:17

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

Zitat von Bernhard Geyer
Zitat:

Zitat von sirius
Aber mit getmem Speicher zu alloziieren, welcher ausgeführt werden soll, ist nicht so toll. Das steht in anderen Threads besser (virtualalloc, virtualfree).

Was sagt den der Speicherschutz von XP/Vista dazu bzw. Viren-Scanner?

Besser der DEP (Data Execution Prevention), ab 2003 Server unterstützt, wenn die CPU es kann. Ansonsten wurden nur die Deskriptoren etwas restriktiver in ihren Access Bits angelegt.

Thanatos81 4. Jan 2008 17:40

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

Zitat von sirius
Aber hier würde ich lieber eine neue Klasse schreiben, die nur eine Liste mit der Beziehung Handle<->Objektinstanz beinhaltet.

So ähnlich habe ich es nun gemacht. Hab mir die TObjectList für meine Bedürfnisse ein wenig umgeschrieben ;-)

Danke noch mal an alle!


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:48 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