-
Здравствуйте, подскажите, пожалуйста, как можно подключиться из одного приложения к 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. Заранее спасибо за помощь в решении вопроса.
-
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.
-
Сергей, а нельзя ли по-понятнее, "по-руссифицированнее"? Что можно сделать? Может создать COM-объект в виде exe, а не dll.
-
> Что можно сделать?
Можно, к примеру, попробовать
> initialization > TAutoObjectFactory.Create(ComServer, TSingleEventer, Class_SingleEventer, сiMultiInstance, tmApartment); > end.
-
> Можно, к примеру, попробовать > > > > initialization > > TAutoObjectFactory.Create(ComServer, TSingleEventer, > Class_SingleEventer, сiMultiInstance, tmApartment); > > end.
С этого я начинал, но, к сожалению, "коннекта" не происходит. Сейчас попробовал сделать COM-exe. Пока результатов нет. Спасибо за сотрудничество, Сергей.
-
> к сожалению, "коннекта" не происходит
Как это "не происходит" ?
-
Вопрос снят. Решил переменные события (EventSink) хранить на форме (форма для всех клиентов общая, используем ее как общее хранилище).
|