dcom问题(50分)

S

server

Unregistered / Unconfirmed
GUEST, unregistred user!
服务器端怎样发送数据给客户端.
比如两个客户交互,客户一发送数据给服务程序.
服务程序怎样发送此数据给客户二.
 
RPC参数声明为变参不就得了!
我以前还用RPC传过文件呢!
 
用这种方式写个BO之类的程序,很容易啊!
 
sorry,没看清题目
如果要server直接访问client,那是不可能的,
如果client调用server的rpc,可以用变参在返回时传递数据
所以我想还是让client定时地访问server容易实现一点。
有什么意见?
 
不过我总觉得让client定时地访问server
比较麻烦,不向其他通信控件那样只要直接在
一个事件里写代码就行了.而且不用考虑会不会
没查询到信息.
 
Server端控制Client端是完全可能的,我做过一个试验,通过将一个Auto COM
传到server端来控制登录的用户,并能关闭任一用户的Client端应用程序.
 
Server如果能控制Client的话那到底谁是Server?我认为不可能。
 
一个client同时也可以是一个Server,Client只要将某一接口传到Server端,
然后Server就可以通过该接口控制Client!
 
COM有二个接口专门为了实现服务器对客户接口的回调:
IConnectionPointContainer;
IConnectionPoint. DELPHI的ACTIVEX单元里有其实现,
大致步骤:
客户端创建服务器对象, 获得连接点接口, 调用ADVISE注册
回调接口.
每当服务器有需要回调的数据时, 就调用某客户的注册的
接口. 此过程称为SINK.
DELPHI 4以后自动化部分加入了事件, 但好象只支持一个
回调接口, 不够用.
 
1。“客户端创建服务器对象”,是另一个完全不同服务器端的服务器对象吗?
2.ADVISE,IConnectionPointContainer和SINK都不能从Delphi或CBUilder的帮助中查到,他们存在吗?
你能举一个例子吗?
 
to CMUX:
看了几篇你的关于com的贴子,都有内涵,佩服. 请不吝赐教.
 
同樣存在該類???,听CMUX等赐教.
 
cmxu说的对,另外如果不想使用IConnectionPointContainer或IConnectionPoint
接口,向服务器传送一个特定的客户端接口也同样可以,只是需要向多个客户端发送
数据时不太方便(需要维护客户接口列表)。
 
最近大量上市的COM/DCOM技术内幕讲得好详细,其中第97页谈到了遍历名叫m_vec的
CComDynamicArray容器的例子可以使我们手动维护接口列表,但可惜都是VC的,没有
cbuilder和delphi的例子,挺难理解的...
 
Server向Client发送消息的方法很多, 最基本的方法有Events和Callback.
使用Events较方便:
1. 新建一个Project并且保存到指定的目录
2. 使用Delphi向导新建一个Automation Object(在ActiveX下)
a. 给出ClassName
b. Check选项Generate event support code
这样创建的Server就具有Events支持
3. 完成你新建的Com Object, 包括属性,方法,事件, 保存TypeLib
4. 建立你的Client,在Uses中引用你新建的Com Object的*_TLB.pas
在此需要建立你的EventSink(比较麻烦), 可以去Binh Ly的网站去
下栽一个EventSink生成程序, 能够将Events打包成为Delphi的
Component以便在Client中使用
5. 配置你的DCOM设置,当然要用到DCOMCNFG.EXE
注意: Client端也要注册你的COM服务才能运行
Binh Ly的竹叶上有很详细的说明和各种实例以及其他的DCOM工具
值得一访, 地址: www.techvanguards.com
 
huizhang:
其实我10天前已经详细看了www.techvanguards.com和下载的例子,但其中的例子
太简单,而且没有用vtable,只是当Client调Server的TriggerEvent1()方法时立即用Fire_Event1()回调客户注册的事件处理过程。
而我想达到的效果是:当有多个Client向Server注册了相同的接口时,而且事件过一段时间才发生,此时Server才去回调合适的Client定义的事件处理过程,此时应该如何修改www.techvanguards.com上的模板源程序,以便回调到我想调用的Client?
 
to zhfle:
要想Server发送消息给指定的Client,你需要设置一个全局的用户列表,每个用户
在创建了CoClass之后, 应该通过一个RegUser method注册用户的名称到你的列
表之中同时注册用户CoClass的指针(如果是multithread), 要发送消息的时候找
到这个用户的CoClass激发相应的事件. 注意,在destroy的时候从用户列表中去掉
注册的用户.
具体做法 可以在Com Object的单元中声明一个TStringList,并且在单元的
initialization创建 在finalization时候free.
type
TMyComObject = class(TAutoObject, iConnectionPointContainer, iMyObject)
private
...
FUserName: widestring;
protected
...
procedure RegUser(UserName: widestring);
public
destructor destroy;
override;
end;

var
UserList: TList;
implementation
....
procedure TMyObject.Login(const UserName: WideString);
begin
FUserName := UserName;
UserList.Add(UserName,self);
end;

initialization
TAutoObjectFactory.Create(ComServer, YourObject, Class_ofYourObject,
ciMultiInstance, tmApartment);
//create userlist
UserList := TStringList.Create;
finalization
UserList.Free;
end.
 
to zhfle:
Binh Ly's DCOM page can be reachied at:
http://www.intac.com/~bly/com/index.htm
I have made a sample chat server and client which is available at:
http://www.netdrive.com/~oldpeasant/MyPublicFiles/
 
顶部