AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Tapi Event läuft nicht immer

Ein Thema von OlliWW · begonnen am 9. Okt 2015 · letzter Beitrag vom 23. Okt 2015
Antwort Antwort
OlliWW

Registriert seit: 31. Aug 2011
128 Beiträge
 
#1

Tapi Event läuft nicht immer

  Alt 9. Okt 2015, 15:49
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.
Angehängte Dateien
Dateityp: zip TapiTESTProgramm.zip (84,1 KB, 33x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#2

AW: Tapi Event läuft nicht immer

  Alt 9. Okt 2015, 16:47
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.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
Lyan

Registriert seit: 5. Aug 2011
182 Beiträge
 
#3

AW: Tapi Event läuft nicht immer

  Alt 22. Okt 2015, 16:22
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
  Mit Zitat antworten Zitat
OlliWW

Registriert seit: 31. Aug 2011
128 Beiträge
 
#4

AW: Tapi Event läuft nicht immer

  Alt 23. Okt 2015, 10:15
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"
  Mit Zitat antworten Zitat
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 07:36 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf