Конференция "Corba" » Connecting to COM [Delphi, Windows]
 
  • Checkmate-maker © (03.10.07 14:13) [0]
    Здравствуйте, подскажите, пожалуйста, как можно подключиться из одного приложения к COM-объекту, созданному другим приложением. Так, например, к Word-у connect проходит без проблем. К моему COM-объекту "коннектиться" не получается (создаются два экземпляра).

     Описание COM-а:

    type
     TSingleEventer = class(TAutoObject, IConnectionPointContainer, ISingleEventer)
     private
       { Private declarations }
       FConnectionPoints: TConnectionPoints;
       FConnectionPoint: TConnectionPoint;
       FEvents: ISingleEventerEvents;
       { note: FEvents maintains a *single* event sink. For access to more
         than one event sink, use FConnectionPoint.SinkList, and iterate
         through the list of sinks. }
     public
       procedure Initialize; override;
     protected
       { Protected declarations }
       property ConnectionPoints: TConnectionPoints read FConnectionPoints
         implements IConnectionPointContainer;
       procedure EventSinkChanged(const EventSink: IUnknown); override;
       procedure NextIter(IterationsToDo: Integer); safecall;
     end;

    implementation

    uses ComServ;

    procedure TSingleEventer.EventSinkChanged(const EventSink: IUnknown);
    begin
     FEvents := EventSink as ISingleEventerEvents;
    end;

    procedure TSingleEventer.Initialize;
    begin
     inherited Initialize;
     FConnectionPoints := TConnectionPoints.Create(Self);
     if AutoFactory.EventTypeInfo <> nil then
       FConnectionPoint := FConnectionPoints.CreateConnectionPoint(
         AutoFactory.EventIID, ckSingle, EventConnect)
     else FConnectionPoint := nil;
    end;

    procedure TSingleEventer.NextIter(IterationsToDo: Integer);
    begin
     FEvents.NextIter(IterationsToDo);
    end;

    initialization
     TAutoObjectFactory.Create(ComServer, TSingleEventer, Class_SingleEventer,
       ciSingleInstance, tmApartment);
    end.

    Описание приложения:
    unit TestUnit;

    interface

    uses
     OleServer,
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
     Dialogs, StdCtrls, My_TLB,  ComObj;

    type
     TForm1 = class(TForm)
       Button1: TButton;
       Button2: TButton;
       Button3: TButton;
       procedure Button1Click(Sender: TObject);
       procedure Button2Click(Sender: TObject);
       procedure Button3Click(Sender: TObject);
     private
       { Private declarations }
     public
       procedure NextIter(Sender: TObject; IterationsToDo: Integer);
     end;

    var
     Form1: TForm1;
     
     MySingleEventer, MySingleEventerC: TSingleEventer;

    implementation

    {$R *.dfm}

    { TForm1 }

    procedure TForm1.NextIter(Sender: TObject; IterationsToDo: Integer);
    {Обработчик события}
    begin
     ShowMessage(IntToStr(10*IterationsToDo));
    end;

    procedure TForm1.Button1Click(Sender: TObject);{Создаем MySingleEventer}
    begin
    try
      MySingleEventer := TSingleEventer.Create(self);
    except
       ShowMessage('Error on creating');
     end;
    end;

    procedure TForm1.Button2Click(Sender: TObject);{Подключаемся к MySingleEventer}
    begin
     try
       MySingleEventerC := TSingleEventer.Create(self);
       MySingleEventerC.Connect
       MySingleEventerC.OnNextIter := NextIter;
     except
       ShowMessage('Error on connecting');
     end;      
    end;

    procedure TForm1.Button3Click(Sender: TObject); {проверка, произойдет ли вызов обработчика}
    begin
     MySingleEventer.NextIter(15);
    end;

    end.
     
     Заранее спасибо за помощь в решении вопроса.
  • Сергей М. © (03.10.07 15:06) [1]
    ciMultiInstance

    The COM object is created as one of multiple instances within the same executable. Any time a client requests service, a separate instance of the object gets invoked.
  • Checkmate-maker © (03.10.07 15:30) [2]
    Сергей, а нельзя ли по-понятнее, "по-руссифицированнее"? Что можно сделать? Может создать COM-объект в виде exe, а не dll.
  • Сергей М. © (03.10.07 16:33) [3]

    > Что можно сделать?


    Можно, к примеру, попробовать


    > initialization
    >  TAutoObjectFactory.Create(ComServer, TSingleEventer, Class_SingleEventer, сiMultiInstance, tmApartment);
    > end.
  • Checkmate-maker © (03.10.07 16:38) [4]

    > Можно, к примеру, попробовать
    >
    >
    > > initialization
    > >  TAutoObjectFactory.Create(ComServer, TSingleEventer,
    > Class_SingleEventer, сiMultiInstance, tmApartment);
    > > end.


    С этого я начинал, но, к сожалению, "коннекта" не происходит. Сейчас попробовал сделать COM-exe. Пока результатов нет. Спасибо за сотрудничество, Сергей.
  • Сергей М. © (04.10.07 09:23) [5]

    > к сожалению, "коннекта" не происходит


    Как это "не происходит" ?
  • Checkmate-maker © (04.10.07 09:38) [6]
    Вопрос снят. Решил переменные события (EventSink) хранить на форме (форма для всех клиентов общая, используем ее как общее хранилище).
 
Конференция "Corba" » Connecting to COM [Delphi, Windows]
Есть новые Нет новых   [120347   +17][b:0][p:0]