Einzelnen Beitrag anzeigen

OlliWW

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

Tapi Event läuft nicht immer

  Alt 9. Okt 2015, 14: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