关于COM+中的事件订阅 (300分)

  • 主题发起人 主题发起人 clncln
  • 开始时间 开始时间
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;

可以这样注册吗?
不可以这样注册吗?
…………
 
我也想问同样的问题,没想到……
嘿嘿
 
一起钻研。
hehe.
 
关注中,永久订阅怎么进行啊?
我用C++ Builder生成的COM+ EventClass无法在Win2000中注册,但是Delphi6生成的却可以,
不知道是不是C++ Builder的Bug
 
哪位老大做过COM服务器。请指教!!!!!!!!!!分数好商量!!!!!
我想做多层结构的数据库系统。。。。。。

我不知道怎么写COM服务器,我能不能写出来像在BCB里封装的控件那样呀!!!
有没有例子可以让小弟看看!!!
分数可以商量!·!!!
 
学习。COM+进行中
 
正想去看看这方面的书。好在我就在图书城旁。
 
To santgan
在Delphi的COM+例子目录中有一个Com+的安装示例文件,是.DOC格式的,不知你注意
到没有,里面详细说明了永久订阅的方法
 
我也想学啊!,就是不知道何从下手!
也想找个范例来学习!,哪位兄弟有这一样方面的资料,请借给兄弟学习一下!
分数吗,可以商量!!!!!!!!!!!!
 
大虾们关注一下,谢谢
 
to clncln:
var atest:itest;
begin
atest:=cotest.createremote('machine');//请问这里出现接口不支持的错误是什么???
atest.method;
end;
 
小弟很可怜,DCOM 上的回调函数总是出现这样那样的问题,不知道那位富翁有过处理
DCOM回调函数的经验?可怜,还没有到用COM+的地步哩
 
To abcool:
你的CoTest服务器没有在本地注册吧?
 
偶都不知道偶的程序算不算是三层
 
后退
顶部