C
clncln
Unregistered / Unconfirmed
GUEST, unregistred user!
就像其他富翁经常碰到的情况一样,需要给各客户端发送消息,在DCOM中可以在客户端
生成一个接口,服务器端回调此接口,我已经实现类似的广播系统。
可是在COM+中事件机制有所不同,事件独立了出来,根据MSDN:有公布者(Publisher)、
订阅者(Subscriber)、事件(Event),Publisher调用Event,Event按顺序或是同时
调用Subscriber。
在Subscriber中又分永久订阅者(PerpetuitySubscriptions),如Delphi6自带的例子中
就是永久订阅者;临时订阅者(TransientSubscriptions),也是我的问题所在:
1、COM+事件究竟可不可以支持跨机器的调用?MSDN有的说暂时还不支持,有的说:“如果
采用排队组件(Queue)可能会因为传输原因造成事件不能及时相应……”,那就是可以
支持跨机器的调用罗,一塌糊涂
2、COM+的事件中的TransientSubscriptions.SubscriberInterface属性,即客户端实现
事件的接口,可不可以通过中间层传给COM+事件系统,如何传递呢?我的客户端通过一个
MTS组件传递一个事件接口时,在MTS组件端出现:“未知的验证服务”
用一个实例来说明
服务器端调用客户端的接口(感谢cmldy提供的提示范例)
在客户端生成一个COM接口事例:
TClockSubscription = class( TAutoIntfObject, IClockEvent )
// ^Delphi6中的范例
procedure HourChange(Hour: Integer);
safecall;
procedure MinuteChange(Minute: Integer);
safecall;
procedure SecondChange(Second: Integer);
safecall;
end;
//…………实现Hourchange,MinuteChange,SecondChange
//在客户端启动时生成TClockSubscription实例
procedure TForm1.FormCreate(Sender: TObject);
var
ServerTypeLib: ITypeLib;
TypeLibResult: HResult;
KGBServer:IKgbServer;
//^中间件,为一Mts组件
begin
TypeLibResult := LoadRegTypeLib(LIBID_Event, 1, 0, 0,ServerTypeLib );
if TypeLibResult<>S_OK then
Exit;
ClockSubscription:=TClockSubscription.Create(ServerTypeLib,IClockEvent);
// ^生成实例
KGBServer:=CoKGBServer.CreateRemote('Exserver');
KGBServer.RegisterEvent(ClockSubScription);
// ^ 调用中间件的一个方法实现向Com+事件系统注册
end;
//在服务器端
procedure TKGBServer.RegisterEvent(const Subscrption: IUnknown);
var
oCollection:ICatalogCollection;
iTransientSubscriptions :ICatalogObject;
ComAdmin:ICOMAdminCatalog;
ClockSubscription:IClockEvent;
begin
ComAdmin:=CreateCOMObject(CLASS_COMAdminCatalog) as ICOMAdminCataLog;
//调用COMAdminCataLog准备向事件系统注册,在Delphi6中有这样一个组件,不过这里没用
oCollection:=ComAdmin.GetCollection('TransientSubscriptions') as ICatalogCollection;
iTransientSubscriptions :=oCollection.Add as ICatalogObject;
iTransientSubscriptions.Value ['Name']:='TransientSubscriptions';
iTransientSubscriptions.Value ['SubscriberInterface']:=Subscrption as IClockEvent;
iTransientSubscriptions.Value ['EventCLSID']:='{EE7F04CA-5CB1-4213-8874-5AEA140CC7BC}';
iTransientSubscriptions.Value ['MethodName']:='HourChange';
oCollection.SaveChanges ;
// [red]^出现“未知的验证服务”[/red]
end;
可以这样注册吗?
不可以这样注册吗?
…………
生成一个接口,服务器端回调此接口,我已经实现类似的广播系统。
可是在COM+中事件机制有所不同,事件独立了出来,根据MSDN:有公布者(Publisher)、
订阅者(Subscriber)、事件(Event),Publisher调用Event,Event按顺序或是同时
调用Subscriber。
在Subscriber中又分永久订阅者(PerpetuitySubscriptions),如Delphi6自带的例子中
就是永久订阅者;临时订阅者(TransientSubscriptions),也是我的问题所在:
1、COM+事件究竟可不可以支持跨机器的调用?MSDN有的说暂时还不支持,有的说:“如果
采用排队组件(Queue)可能会因为传输原因造成事件不能及时相应……”,那就是可以
支持跨机器的调用罗,一塌糊涂
2、COM+的事件中的TransientSubscriptions.SubscriberInterface属性,即客户端实现
事件的接口,可不可以通过中间层传给COM+事件系统,如何传递呢?我的客户端通过一个
MTS组件传递一个事件接口时,在MTS组件端出现:“未知的验证服务”
用一个实例来说明
服务器端调用客户端的接口(感谢cmldy提供的提示范例)
在客户端生成一个COM接口事例:
TClockSubscription = class( TAutoIntfObject, IClockEvent )
// ^Delphi6中的范例
procedure HourChange(Hour: Integer);
safecall;
procedure MinuteChange(Minute: Integer);
safecall;
procedure SecondChange(Second: Integer);
safecall;
end;
//…………实现Hourchange,MinuteChange,SecondChange
//在客户端启动时生成TClockSubscription实例
procedure TForm1.FormCreate(Sender: TObject);
var
ServerTypeLib: ITypeLib;
TypeLibResult: HResult;
KGBServer:IKgbServer;
//^中间件,为一Mts组件
begin
TypeLibResult := LoadRegTypeLib(LIBID_Event, 1, 0, 0,ServerTypeLib );
if TypeLibResult<>S_OK then
Exit;
ClockSubscription:=TClockSubscription.Create(ServerTypeLib,IClockEvent);
// ^生成实例
KGBServer:=CoKGBServer.CreateRemote('Exserver');
KGBServer.RegisterEvent(ClockSubScription);
// ^ 调用中间件的一个方法实现向Com+事件系统注册
end;
//在服务器端
procedure TKGBServer.RegisterEvent(const Subscrption: IUnknown);
var
oCollection:ICatalogCollection;
iTransientSubscriptions :ICatalogObject;
ComAdmin:ICOMAdminCatalog;
ClockSubscription:IClockEvent;
begin
ComAdmin:=CreateCOMObject(CLASS_COMAdminCatalog) as ICOMAdminCataLog;
//调用COMAdminCataLog准备向事件系统注册,在Delphi6中有这样一个组件,不过这里没用
oCollection:=ComAdmin.GetCollection('TransientSubscriptions') as ICatalogCollection;
iTransientSubscriptions :=oCollection.Add as ICatalogObject;
iTransientSubscriptions.Value ['Name']:='TransientSubscriptions';
iTransientSubscriptions.Value ['SubscriberInterface']:=Subscrption as IClockEvent;
iTransientSubscriptions.Value ['EventCLSID']:='{EE7F04CA-5CB1-4213-8874-5AEA140CC7BC}';
iTransientSubscriptions.Value ['MethodName']:='HourChange';
oCollection.SaveChanges ;
// [red]^出现“未知的验证服务”[/red]
end;
可以这样注册吗?
不可以这样注册吗?
…………