AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Tapi Callback Funktion darf nicht in Klasse sein

Ein Thema von Jumpy · begonnen am 26. Nov 2012 · letzter Beitrag vom 27. Nov 2012
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

AW: Tapi Callback Funktion darf nicht in Klasse sein

  Alt 26. Nov 2012, 12:15
Delphi-Quellcode:
unit MyTapiObj;

interface

type
  TMyTapiObj = class
  protected
    procedure CalledFromCallBack;
  public
    constructor Create;
    destructor Destroy; override;
  end;

implementation

var
  _TapiInitialized : Boolean;
  _MyTapiObjList : TObjectList;

procedure TapiCallBack;
var
  LIdx : Integer;
begin
  for LIdx := 0 to Pred( _MyTapiObjList ) do
    ( _MyTapiObjList[LIdx] as TMyTapiObj ).CalledFromCallBack;
end;

procedure TapiInitialize;
begin
  if not _TapiInitialized then
  begin

    // Initialization code goes here

    _TapiInitialized := True;
  end;
end;

constructor TMyTapiObj.Create;
begin
  inherited;
  TapiInitialize;
  _MyTapiObjList.Add( Self );
end;

destructor TMyTapiObj.Destroy;
begin
  _MyTapiObjList.Remove( Self );
  inherited;
end;

initialization

  _MyTapiObjList := TObjectList.Create( False );

finalization

  _MyTapiObjList.Free;

end.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: Tapi Callback Funktion darf nicht in Klasse sein

  Alt 26. Nov 2012, 12:20
Alternativ mal hier in der DP nach MakeProcInstance suchen. Diese Funktion generiert dir einen klassischen Funktionspointer, der aber dafür sorgt, dass dein Callback im Kontext der Objektinstanz ausgeführt wird.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.401 Beiträge
 
Delphi 12 Athens
 
#3

AW: Tapi Callback Funktion darf nicht in Klasse sein

  Alt 26. Nov 2012, 12:52
Wenn es keine Methode sein darf, dann kann man das dennoch als statische Klassenmethode deklarieren, welche die selbe Signaur besitzt, wie eine normale Funktion/Prozedur.

Delphi-Quellcode:
type
  TIrgendwas = class
    class function MyCallback(P: PAnsiChar): Integer; stdcall; static;
  end;

// entspricht

function MyCallback(P: PAnsiChar): Integer; stdcall;
static lässt bei Klassenmethoden das Self weg.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Tapi Callback Funktion darf nicht in Klasse sein

  Alt 26. Nov 2012, 12:58
@himitsu

Kann Delphi 6 schon class procedures?
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.401 Beiträge
 
Delphi 12 Athens
 
#5

AW: Tapi Callback Funktion darf nicht in Klasse sein

  Alt 26. Nov 2012, 13:04
Hmmmmm, müßte man ausprobieren.
D7 kannte das (glaub ich) zumindestens schon.

(wäre ja zu toll, wenn sowas in der OH stünde ... so wie beim MSDN )
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.691 Beiträge
 
Delphi 12 Athens
 
#6

AW: Tapi Callback Funktion darf nicht in Klasse sein

  Alt 26. Nov 2012, 13:30
Eigentlich ist das nicht unbedingt verkehrt, wenn hier Lösungen zu der Frage gepostet werden, die mit der Delphi-Version des Fragenden gar nicht umgesetzt werden können. Wenn jemand nach einem ähnlichen Problem sucht, mag der ja durchaus eine neuere Delphi-Version haben. Man muss sich ja nicht unnötigerweise die Sourcen verrenken.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von sh17
sh17

Registriert seit: 26. Okt 2005
Ort: Radebeul
1.682 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Tapi Callback Funktion darf nicht in Klasse sein

  Alt 26. Nov 2012, 13:41
Kann Delphi 6 schon class procedures?
ja, funktioniert bereits in Delphi 6
Sven Harazim
--
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.740 Beiträge
 
Delphi 6 Enterprise
 
#8

AW: Tapi Callback Funktion darf nicht in Klasse sein

  Alt 26. Nov 2012, 14:11
Aus der SDK über die Tapi:

Zitat:
The lineCallbackFunc function is a placeholder for the application-supplied function name.

VOID FAR PASCAL lineCallbackFunc(

DWORD hDevice,
DWORD dwMsg,
DWORD dwCallbackInstance,
DWORD dwParam1,
DWORD dwParam2,
DWORD dwParam3
);


Parameters

hDevice

A handle to either a line device or a call associated with the callback. The nature of this handle (line handle or call handle) can be determined by the context provided by dwMsg. Applications must use the DWORD type for this parameter because using the HANDLE type may generate an error.

dwMsg

A line or call device message.

dwCallbackInstance

Callback instance data passed back to the application in the callback. This DWORD is not interpreted by TAPI.

dwParam1

A parameter for the message.

dwParam2

A parameter for the message.

dwParam3

A parameter for the message.



Remarks

For information about parameter values passed to this function, see Line Device Messages.
All callbacks occur in the application's context. The callback function must reside in a DLL or application module.
Eine andere Bemerkung dazu, die ich gefunden hatte. Heißt das nun, Statische Methode oder Klassenmethode ist OK, oder auch nicht?

Zitat:
Additionally, the callback function must be a global procedure, not a class member (method). The problem in substituting a callback function by a class member is that Windows does not understand either C++ class member functions or Delphi's methods which carry "this" and "self" as a first hidden parameter.
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#9

AW: Tapi Callback Funktion darf nicht in Klasse sein

  Alt 26. Nov 2012, 14:29
IMHO hat nur Zacherl die passende Lösung angeboten ...
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.401 Beiträge
 
Delphi 12 Athens
 
#10

AW: Tapi Callback Funktion darf nicht in Klasse sein

  Alt 26. Nov 2012, 14:29
Wie gesagt, eine statische Klassenmethode hat kein Self/this, also kann sie wie eine normale "globale" Funktion verwendet werden.

Eine Methoden und eine normale Klassenmethode haben aber einen "versteckten" noch Self-Parameter, außerdem bestehen diese Methoden-Zeiger aus zwei "Zeigern" (die Codeadresse und das Self),
wärend normale Prozeduren und statische Klassenmethoden nur einen Zeiger zur Adressierung benötigen.


Im Prinzip ist eine statische Klassenmethode eine "normale" Prozedur (von der Parametern her), nur daß sie "optisch" in einer Klasse drinsteckt. Sie kann auch nicht dynamisch virtuell, abstrakt sein.
Es ist halt ein "Design"-Element, um seinen Code aufräumen zu können.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (26. Nov 2012 um 14:33 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 12:39 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