Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.04.2009, 15:34   #1
emilregis
Пользователь
 
Регистрация: 28.04.2009
Сообщений: 10
По умолчанию Infra call center

Уважаемые профи,помогите пожалуйста разобраться в чём ошибка?
суть приложения в том что оно цепляется к проге Infra call center,которая ловит звонки пользователей,и записывает в файл номер телефона...
Но у меня выскакивает ошибка...
Выкладываю весь код проги...
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DB, DBClient, MConnect, SConnect, ComCtrls, ADODB,ComObj,
  Inifiles,ToolWin, ActnMan, ActnCtrls, ActnMenus,InfraCallCenterClientFacade2_TLB
  ,INFRACSREMOTEPROXYLib2_TLB,ActiveX, OleCtrls,Mask;

type

  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Button1: TButton;

    procedure Button1Click(Sender: TObject);
    
  private
    { Private declarations }
  public
    { Public declarations }
    FICC:ICallCenter;
    FIAG:IAgent;
    FIFS:IAgentSession;
    connectionManager, connection: OleVariant;
    clientFacade: IUnknown;
    agentSession:IAgentSession;
    phoneSession:IAgentPhoneSession;
    IAPS:IAgentPhoneSessionEvents ;
  end;

var
  Form1: TForm1;

implementation
{$R *.dfm}

//-------------------------------------------------------------
//процедура записи в файл
procedure fileCreate(fName,str: String);
var fileT: TextFile;

begin

DeleteFile(fName);
  AssignFile(fileT,fName); 
  {$I-}
  Append(fileT); 
  if IOResult<>0 then 
  begin
    {$I-}
    Rewrite(fileT); 
    {$I+}
    if IOResult<>0 then 
    begin
      ShowMessage('Ошибка создания файла ' + fName);
      Exit;
    end;
  end;
  WriteLn(fileT,str); 
  CloseFile(fileT); 
end;

//-----------------------------------------------------------------------------
//процедура определения номера
procedure writeNum(pSession: IAgentPhoneSession);
var
phoneCall: OleVariant;
phoneCalls:IPhoneCallCollection;
num,i: Integer;
ini:TIniFile;
nOut,nLog,a,str: String;
begin
ini:=TiniFile.Create('...file.ini');
nout:=Ini.ReadString('FILES','out',a);
nlog:=Ini.ReadString('FILES','log',a);
  try
  psession.QueryInterface(IPhoneCallCollection,phoneCalls);
  except
  exit;
  end;
if (assigned(phoneCalls)) then
begin
  for i:=0 to phoneCalls.Count  do
  begin
    phoneCall:=phoneCalls.Item[i];
    num:=phoneCall.ConnectedNumber;
    showmessage(inttostr(num));
    if ((num<>null)and(length(intToStr(num))>0))  then
    begin
      str:=intToStr(num);
      phoneCall:=null;
    end;
  end;
end;
if (str <> null) and (length(str)>2) then
begin
  fileCreate(nout,str);
  str:= DateToStr(Date) + ' ' + TimeToStr(Date) + ' ' + str;
  fileCreate(nlog,str);
  str:=null;
end;
end;
//----------------------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
var
  username,password,csConnectionRegPath:String;
  phoneCalls:IPhoneCallCollection;
begin
username := Edit1.Text;
password := Edit2.Text;
csConnectionRegPath := 'Software\Infra Telesystems\Infra Communications Suite\2.30\CallCenterClientConnection';
edit1.Enabled:=false;
edit2.Enabled:=false;

  connectionManager := CreateOleObject('INFra.ICSFacadeConnector.ConnectionManager');
try
  connection:=connectionManager.OpenConnection('192.168.1.80', username, 'INFRAPBX120', password);
except
  ShowMessage('Неправильно указаны логин и/или пароль');
  Exit;
end;
  clientFacade:=connection.GetFacade('{85DF82AA-0961-4C7B-B5B8-2541DB635DC0}',0 );
  clientFacade.QueryInterface(ICallCenter, FICC);
  FIAG := FICC.Agent as IAgent;
  phoneSession:=FIAG.PhoneSession as IAgentPhoneSession;
  ShowMessage('1');
  if (not assigned(phoneSession) or not phoneSession.Opened) then
  begin
  ShowMessage('2');
    FIAG.OpenPhoneSession('',PhoneSessionType_Handset,'');
    ShowMessage('3');
    phoneSession:=FIAG.PhoneSession as IAgentPhoneSession;
    ShowMessage('4');
  end;
while (true)  do
  begin
    if (phoneSession.PhoneState<>PhoneState_Idle)  //вот здесь ошибка
    then
         writeNum(phoneSession);
    end;
end;
   
end.
да, ошибка OLE error C0000096 или access violation..
это как я понял значит что объект ссылается на пустое место в памяти...но почему оно пустое?!ведь сессия создана и открыта
emilregis вне форума Ответить с цитированием
Старый 28.04.2009, 16:03   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А надо phoneSession проверять на NIL
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.04.2009, 17:23   #3
emilregis
Пользователь
 
Регистрация: 28.04.2009
Сообщений: 10
По умолчанию

Да я проверял...вот так if (not assigned(phonesession)) then ...
С сессией всё в порядке
emilregis вне форума Ответить с цитированием
Старый 28.04.2009, 17:37   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Значит нет такого свойства PhoneState.
Поставь бряк на ту строку и посмотри в отладчике чем пахнет свойство.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.04.2009, 17:41   #5
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

надо дебажить с этого места
Код:
 phoneSession:=FIAG.PhoneSession as IAgentPhoneSession;
видимо, phoneSession.PhoneStat не выставляется/чота там не создается...
soleil@mmc вне форума Ответить с цитированием
Старый 28.04.2009, 17:51   #6
emilregis
Пользователь
 
Регистрация: 28.04.2009
Сообщений: 10
По умолчанию

Блин.фишка в том что все эти интерфейсы библиотечные..а реализация методов закрыта разработчиками...примерно то же самое на джаваскрипте работает,что интересно,а на делфи это свойство фоунстейт остается пустым
emilregis вне форума Ответить с цитированием
Старый 28.04.2009, 18:01   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Значит где-то ты неверно интерфейс получил или преобразовал
У меня было такое когда я с Солидом и Компасом разбирался.
Просто стал ставить проверки на каждый метод, так и вычислил косяк. Тяжко но пришлось.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.04.2009, 05:18   #8
emilregis
Пользователь
 
Регистрация: 28.04.2009
Сообщений: 10
По умолчанию

Извиняюсь за глупый вопроспросто не совсем понял,как ставить проверки на каждый метод?там же в основном получение интерфейсов одного из другого..а методы типа оупенсессион скрыты.как их проверять?
emilregis вне форума Ответить с цитированием
Старый 29.04.2009, 08:22   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну как... Поставь Бреакпоинт, и при достижении онного в watch добавь нужный интерфейс. Там увидиш Nil он или нет. Так же и с его свойствами и методами. Или мышку наведи при бряке на метод, и увидишь в подсказке...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.04.2009, 08:43   #10
emilregis
Пользователь
 
Регистрация: 28.04.2009
Сообщений: 10
По умолчанию

когда навожу курсор на phoneSession пишет pointer($...) as IAgentPhoneSession...
а при наведении на phoneSession.PhoneState пишет access violation...
как я понимаю это значит что объект IAgentPhoneSession успешно создаётся,а свойство у него не пишется?
emilregis вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Call of duty 4 Соколов Дмитрий Gamedev - cоздание игр: Unity, OpenGL, DirectX 1 03.04.2009 12:40
Oracle C++ Call lnterface eds C/C++ Базы данных 1 09.02.2009 13:51
Remote call в Delphi alexBlack Обсуждение статей 0 05.01.2009 16:27
Only assignment, call . . . RIO Общие вопросы .NET 2 03.05.2008 16:55