Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Tapi Event läuft nicht immer (https://www.delphipraxis.net/186899-tapi-event-laeuft-nicht-immer.html)

OlliWW 9. Okt 2015 14:49

Tapi Event läuft nicht immer
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Zusammen,

Ich möchte gern ein kleines Tapi Programm selbst schreiben, es soll mir die anrufende Nummer anzeigen sowie den Status, wenn aufgelegt worden ist, bzw wenn abgenommen worden ist.

Dazu habe ich die Tapi3.DLL von Windows importiert und die notwendige Änderung mit dem "Initialize" vorgenommen.

Mein Problem ist nun aber:
Wenn ein Anruf zustande kommt, wird das Event "Offering" aufgerufen, allerdings werden die CallStates "Disconnectd" und "Connected" niemals aufgerufen.
Nach ein wenig debuggen habe ich herausgefunden, dass wenn ich einen Breakpoint in meinem TapiEvent setze und er beim Offering dort reinspringt, ich aber nicht mit F9 oder ähnlichem weiterspringe, sondern solange warte bis abgenommen und aufgelegt worden ist, die Events angezeigt werden. Irgendwas scheint nicht mit dem Event in Ordnung zu sein, ich kann mir aber keinen Reim darauf machen.

Hier mal das komplette Code:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, TAPI3Lib_TLB;

type
  TForm1 = class(TForm)
    Button1: TButton;
    ComboBox1: TComboBox;
    Button2: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure TapiEvent(ASender: TObject; TapiEvent: TAPI_EVENT; const pEvent: IDispatch);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    objTapi: TTAPI;
    addr:    ITAddress;
    addrs :  IEnumAddress;
    lwCeltFetched : Cardinal;
  end;

const
  TAPIMEDIATYPE_AUDIO = $8;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  Request: ITRequest;
  dispatch: ITDispatchMapper;
begin
  Request := CoRequestMakeCall.Create;
  Request.MakeCall('555-5555','','','');
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  iToken: HRESULT;
begin
  iToken := 0;
  addrs := objTapi.DefaultInterface.EnumerateAddresses;
  while ( S_OK = addrs.Next(1,addr,lwCeltFetched) ) do
  begin
    if addr.AddressName = ComboBox1.Items[ComboBox1.ItemIndex] then
    begin
      break;
    end;
  end;
  objTapi.EventFilter := TE_CALLNOTIFICATION or TE_CALLSTATE;
  iToken := objTapi.RegisterCallNotifications(addr,true,false,TAPIMEDIATYPE_AUDIO,1);
  Memo1.Lines.Clear;
end;

procedure TForm1.TapiEvent(ASender: TObject; TapiEvent: TAPI_EVENT; const pEvent: IDispatch);
var
  evntCallState: ITCallStateEvent;
  callInfo:     ITCallInfo;
  sTelefonnummer:String;
begin
  Memo1.Lines.Add('Fired: ' + IntToStr(TapiEvent));
  case TapiEvent of
    TE_CALLNOTIFICATION:
      begin
        Memo1.Lines.Add('Callnotification');
      end;
    TE_CALLSTATE:
      begin
         evntCallState := ITCallStateEvent(pEvent);
         callInfo := evntCallState.Call;
         case evntCallState.State of
            CS_OFFERING:
              begin
                sTelefonnummer := callInfo.Get_CallInfoString(CIS_CALLERIDNUMBER);
                Memo1.Lines.Add('Offering von: ' + sTelefonnummer);
              end;
            CS_CONNECTED:
              begin
                Memo1.Lines.Add('Verbunden');
              end;
            CS_DISCONNECTED:
              begin
                Memo1.Lines.Add('Aufgelegt');
              end;
         end;
      end;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  objTapi := TTAPI.Create(Self);
  objTapi.Connect;
  objTapi.OnEvent := TapiEvent;
  addrs := objTapi.DefaultInterface.EnumerateAddresses;
  ComboBox1.Items.Clear;
  while ( S_OK = addrs.Next(1,addr,lwCeltFetched) ) do
  begin
    ComboBox1.Items.Add(addr.AddressName);
    ComboBox1.ItemIndex := 0;
  end;
end;



end.

Captnemo 9. Okt 2015 15:47

AW: Tapi Event läuft nicht immer
 
Ich habe zwar keine Antwort für dich, und kann auch mangels Tapi-Anbindung deinen Code nicht ausprobieren,
aber vielleicht hilft die dieser Thread etwas, und bringt dich auf die richtige Spur.

Geht zwar um VB, aber die haben sich mit dem Thema befasst.

Lyan 22. Okt 2015 15:22

AW: Tapi Event läuft nicht immer
 
Hallo,

hier Threads mit dem selben Problem:

http://www.programdoc.com/42_274_1.htm
http://bbs.csdn.net/topics/340235587
http://microsoft.public.win32.progra...api-events-bug

OlliWW 23. Okt 2015 09:15

AW: Tapi Event läuft nicht immer
 
Hallo Lyan,

Den letzten von deinen genannten Links hatte ich in der Zwischenzeit auch schon gefunden und der hat das Problem gelöst.
Es lag tatsächlich an dem "AddRef"


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