AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Callback aus einer DLL in eine Klasse einbinden
Thema durchsuchen
Ansicht
Themen-Optionen

Callback aus einer DLL in eine Klasse einbinden

Ein Thema von Thanatos81 · begonnen am 4. Jan 2008 · letzter Beitrag vom 4. Jan 2008
Antwort Antwort
Seite 1 von 2  1 2      
Thanatos81
(Gast)

n/a Beiträge
 
#1

Callback aus einer DLL in eine Klasse einbinden

  Alt 4. Jan 2008, 13:53
Moin!

Ich versuche gerade eine DLL eines Zulieferes zu verwenden (ja, wieder einmal ). 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"
Wie fülle ich jetzt "OnOPAConnect" mit Leben?

Danke im Voraus!
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Callback aus einer DLL in eine Klasse einbinden

  Alt 4. Jan 2008, 14:09
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Thanatos81
(Gast)

n/a Beiträge
 
#3

Re: Callback aus einer DLL in eine Klasse einbinden

  Alt 4. Jan 2008, 14:15
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

Danke für deine Hilfe!
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Callback aus einer DLL in eine Klasse einbinden

  Alt 4. Jan 2008, 14:47
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
Genau das wollte ich auch vorschlagen nachdem du erklärt hast was du machen willst.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Thanatos81
(Gast)

n/a Beiträge
 
#5

Re: Callback aus einer DLL in eine Klasse einbinden

  Alt 4. Jan 2008, 14:53
Na, dann kann ich ja nicht so dermaßen auf dem Holzweg sein
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Callback aus einer DLL in eine Klasse einbinden

  Alt 4. Jan 2008, 15:08
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Thanatos81
(Gast)

n/a Beiträge
 
#7

Re: Callback aus einer DLL in eine Klasse einbinden

  Alt 4. Jan 2008, 15:09
Ne, leider nicht von mir sondern von einem Hardwarehersteller.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Callback aus einer DLL in eine Klasse einbinden

  Alt 4. Jan 2008, 15:11
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)
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Thanatos81
(Gast)

n/a Beiträge
 
#9

Re: Callback aus einer DLL in eine Klasse einbinden

  Alt 4. Jan 2008, 15:19
Nee, das lassen wir mal lieber Dann doch lieber die richtige Instanz suchen^^
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.606 Beiträge
 
#10

Re: Callback aus einer DLL in eine Klasse einbinden

  Alt 4. Jan 2008, 15:44
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.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:33 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