Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > события компоненты из DLL


Автор: SHKoder 14.8.2013, 10:13
подскажите, пожалуйста. 
хочу сделать DLL и в ней обработчик одной из примученной компоненты.
хитрость вся в том, что методы этой компоненты живут отдельно от ее событий.

другими словами компонента общается с аппаратурой, которая дает отклик через некоторое время, (в зависимости от нагруженности) и методом Connect() я подключаюсь к ней, а в неком событии OnConnected(...) применяются параметры моей сессии, и мне нужно их передать обратно из DLL на вызываемое приложение. 
подскажите, пожалуйста, как это можно реализовать?

буду благодарен фрагментам кода.


не понимаю, что не так я сделал.
пожалуйста, подскажите, как сделать... опыта написания длл оберткой компоненты практически нет.
Код

library MyColler;

uses
  ShareMem,
  Forms, Dialogs,
  SysUtils,
  Classes,Windows, StdCtrls, uControl, Controls,
  ExtCtrls;

{$R *.res}

var
 OldApp, App : TApplication;
 myControl: TConector;


function Initialize(AppHandle: THandle) : Integer;  StdCall;
begin
  Application.Handle:=AppHandle;

   if not Assigned(OldApp) then
   begin
    OldApp := Application;
    Application.ProcessMessages;
    Application := App;
   end;



    myControl := TConector.Create(Application);
    with myControl do
    try
    OnDelivered := Delivered;

     OpenStream('SERVERLINKEDSTRING', 'USERID', 'PWD');
     MonitorDevice('0001');
     MakeCall('0001', '00002', 'Test coll);
     sleep(10000);
    finally
     CloseStream;
     Free;
    end;

Result := 1;
end;



procedure TConector.Delivered(Sender: TObject; connectionCallId: Integer);
begin
 showmessage(IntToStr(connectionCallId));
end;



exports Initialize;

begin
end.



компилятор ругается на строке 
OnDelivered := Delivered;

не задекларирована Delivered
далее ругается на переменную connectionCallId, тоже не задекларирована. но именно она возвращает мне значение из события компоненты.

другими словами, это монитор событий на телефоне.
вот и получается, что обратиться к DLL с инициированием подключения к аппарату, сделать не сложно. далее вызов с аппарата на другой телефон инициирует сессию, и ид этой сессии нужно вернуть на клиент. и событие это отрабатывает не моментально при вызове. более того, это событие Delivered, должно возвращать клиенту connectionCallId при входящем звонке извне, именно тогда, когда пользователь о фигне не думает, т.е. подключение к аппарату свершено, и более не происходит никаких вызовов.

уважаемые опытные, подскажите, пожалуйста, как завести это чудо. спасибо

Автор: Poseidon 14.8.2013, 10:50
Цитата(SHKoder @  14.8.2013,  10:13 Найти цитируемый пост)
не задекларирована Delivered
Ну тут вообще не понятно откуда у тебя такие вопросы, это же основы ООП. У тебя в конце кода реализация этого метода, а где его описание? Описание должно быть там, где описывается TConector, а не тут. Либо создавай наследника TConector и перекрывай Delivered уже тут, но все-равно описание должно быть уже у наследника.

Автор: SHKoder 14.8.2013, 11:45
не Бог весть как, но кое как мне удалось реализовать задуманное. верней сказать первую половину.
да и не очень мне нравится способ. как-то корявенько выходит.


Код


library MyColler;

uses
  ShareMem,
  Forms, Dialogs,
  SysUtils,
  Classes,Windows, StdCtrls, uControl, Controls,
  ExtCtrls;

 type
TctConectorX = class(TPanelCtConector)

procedure Delivered(Sender: TObject; monitorCrossRefId,
  connectionCallId: Integer; connectionDevice, alertingDevice, callingDevice,
  calledDevice, lastRedirectionDevice: ShortString; localConnectionInfo, cause,
  deliveredType: Integer; trunkGroup, trunkMember, split, userInfo: ShortString;
  reason: Integer; distributingDevice, ucid: ShortString;
  flexibleBilling: Boolean);
end;
{$R *.res}

var
 OldApp, App : TApplication;
 ctConectorX : TctConectorX;
 ConCallId : Integer;

procedure TctConectorX.Delivered(Sender: TObject; monitorCrossRefId,
  connectionCallId: Integer; connectionDevice, alertingDevice, callingDevice,
  calledDevice, lastRedirectionDevice: ShortString; localConnectionInfo, cause,
  deliveredType: Integer; trunkGroup, trunkMember, split, userInfo: ShortString;
  reason: Integer; distributingDevice, ucid: ShortString;
  flexibleBilling: Boolean);
begin
 ConCallId := connectionCallId;
end;

function Initialize(AppHandle: THandle) : Integer;  StdCall;
begin

  Application.Handle:=AppHandle;

   if not Assigned(OldApp) then
   begin
    OldApp := Application;
    Application.ProcessMessages;
    Application := App;
   end;

    ctConectorX := TctConectorX.Create(Application);
    with ctConectorX do
     begin
     OnCSTADelivered := Delivered;

     OpenStream('SERVERLINKEDSTRING', 'USERID', 'PWD');
     MonitorDevice('0001');
     MakeCall('0001', '00002', 'Test coll);
     sleep(10000);
     end;
    Application.ProcessMessages;
    Result := ConCallId;
end;

exports Initialize;

begin
end.




теперь вопрос то более конкретный.
категорически не нравится 
sleep(10000);

и второе,
событие OnCSTADelivered может наступить без моего вмешательства.
т.е. к аппарату я подключился, монитор включил и сижу жду, когда мне кто-нить позвонит. тогда выполняется событие и ConCallId := connectionCallId; должен передаться в клиентское приложение. как вот это сделать???

спасибо

Автор: Illusion Dolphin 14.8.2013, 20:34
Цитата

MakeCall('0001', '00002', 'Test coll);

А оно вообще компилируется? smile

Автор: SHKoder 15.8.2013, 08:32
Код

    with ctConectorX do
     begin
     OnCSTADelivered := Delivered;
     OpenStream('SERVERLINKEDSTRING', 'USERID', 'PWD');
     MonitorDevice('0001');
     MakeCall('0001', '00002', 'Test coll');
     end;


т.е. другие методы объекта Вас не смущают?
конечно компилируется. просто я опечатался в одном апострофе. думается мне это не критично для понимания сути.

Автор: Illusion Dolphin 15.8.2013, 08:55
Цитата

т.е. другие методы объекта Вас не смущают?

Нисколько. Сторонние методы без описания. 

Цитата

категорически не нравится 
sleep(10000);

Мне тоже - убирайте его smile Зачем оно вообще используется? 

Цитата

событие OnCSTADelivered может наступить без моего вмешательства.

Это хорошо или плохо? А как надо?
Цитата

т.е. к аппарату я подключился, монитор включил и сижу жду, когда мне кто-нить позвонит. тогда выполняется событие и ConCallId := connectionCallId; должен передаться в клиентское приложение. как вот это сделать???

Как сделать что? Передать что-то куда-то, вызвать OnCSTADelivered  без вашего участия?

P.S. Задавайте чёткие вопросы с чётким кодом, мне что-то вопрос в полной мере не понятен.

Автор: SHKoder 16.8.2013, 12:17
отбой, спасибо, все получилось на ловушках событий

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)