哪位仁兄能给出一个比较详尽的在DCOM体系上应用的回调例子呀(100分)

H

hxning

Unregistered / Unconfirmed
GUEST, unregistred user!
我写了一个基于remotedatamodel, DCOMConnection上的多层应用MIDAS,当时现在想实现从
服务器端到客户端的回调应用,但是一直不知道怎么写
一直搞不清楚怎么定义回调接口,在哪里定义?服务端、客户端怎么配合等等……
没有代码,告诉我实现的步骤也好啊
wuwuwuwuwu……热切期待~~~
 
activeX也就是COM+的回调函数编写和MIDAS的DCOM是否一样的?
我看到有人说用DCOM来做很简单,这里的DCOM是否是COM+?如果不是的话,应该怎么做呢
到底有没有高手可以高手小弟啊
 
在shuszj的大作中说到:
回调机制在分布式多层应用中是相当重要的,的确,我们可以能过心跳机制实现同样的原理,但那样会浪费很大的资源;网络的握手、广播、无用数据的传递等;
那么到底是什么是回调机制?其实,并不完全是回调机制,可以由服务器强制对客户应用程序进行某一特定事件的触发;
请主意一点是,如下:
ICallBack_SL = interface;
ICallBack_SLDisp = dispinterface;
ISL = interface;
ISLDisp = dispinterface;/////////接口需要用Dispinterface;
还是让我们来看一看程序,或许会更容易明白些;
这些不是我写的,随便找了一篇
远程数据模块
unit ServerRDM;
{$WARN SYMBOL_PLATFORM OFF}
interface
uses
Windows, Messages, SysUtils, Classes, ComServ, ComObj, VCLCom, DataBkr,
DBClient, Server_TLB, StdVcl, Provider, DB, ADODB;
type
TCallBack_SL = class(TRemoteDataModule, ICallBack_SL)
BC_ADOConnection: TADOConnection;
BC_ADOQuery: TADOQuery;
BC_DataSetProvider: TDataSetProvider;
private
{ Private declarations }
protected
class procedure UpdateRegistry(Register: Boolean;
const ClassID, ProgID: string);
override;
procedure FromUser(var UserName: OleVariant);
safecall;
public
Call : OleVariant;/////如何应用回调
{ Public declarations }
end;

implementation
{$R *.DFM}
class procedure TCallBack_SL.UpdateRegistry(Register: Boolean;
const ClassID, ProgID: string);
begin
if Register then
begin
inherited UpdateRegistry(Register, ClassID, ProgID);
EnableSocketTransport(ClassID);
EnableWebTransport(ClassID);
end else
begin
DisableSocketTransport(ClassID);
DisableWebTransport(ClassID);
inherited UpdateRegistry(Register, ClassID, ProgID);
end;
end;

procedure TCallBack_SL.FromUser(var UserName: OleVariant);
begin
Call := UserName;//////////只有给其给值,才可以再下步进行调用;
Call.UserFrom;
end;

initialization
TComponentFactory.Create(ComServer, TCallBack_SL,
Class_CallBack_SL, ciMultiInstance, tmApartment);
end.

客户端程序
unit ClientMianUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,Server_TLB, DB, DBClient, MConnect, SConnect,ActiveX,ComObj,ComServ;
type
TSL = Class(TAutoIntfObject,ISL)////////uses ComObj;
protected
procedure UserFrom;
safecall;
end;
TClientMain = class(TForm)
Label1: TLabel;
Button1: TButton;
SocketConnection1: TSocketConnection;
procedure FormCreate(Sender: TObject);
private
LSSL : TSL;///
{ Private declarations }
public
MyCallBackConnect : TDispatchConnection;
{ Public declarations }
end;

var
ClientMain: TClientMain;
implementation
{$R *.dfm}
procedure TClientMain.FormCreate(Sender: TObject);
var
TypeLib : ITypeLib;
////////uses ACtiveX ,
begin
MyCallBackConnect := SocketConnection1;
MyCallBackConnect.Connected := True;
OleCheck(LoadRegTypeLib(LIBID_Server, 1, 0, 0, TypeLib));//////////相当于注册
LSSL := TSL.Create(TypeLib,ISL);//////实例化;
MyCallBackConnect.AppServer.FromUser(LSSL as IDispatch);//////////这儿执行回调;
end;

{ TSL }
procedure TSL.UserFrom;
begin
ShowMessage('回调机制成功');
end;

end
//希望shuszj不会骂我 ^_^
 
to ego:
这里有几个疑问,在客户端的代码里面用到了LoadRegTypeLib,这里需要服务器在客户端运行过才能成功取得TypeLib,
这样的话,岂不是服务器程序和客户端程序不能运行在不同的机器上?
李维的书上说过,使用REMOTEDATAMODULE(DCOM)可以支持回调,这里的回调是指什么回调,是数据库访问的回调还是通常
指的事件回调?
使用remotedatamodule后,哪里可以实现sink事件触发对象,要自己编码吗?
 
1。loadregtypelib用这个函数装入的话,必须先在客户端 进行注册,你也可以用loadtypelib
来做。
2。事件回调。
3。应该要自己编码。
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1458617
 
to yeath:
应该怎样注册,运行一次服务端程序吗,这样岂不是很麻烦?(注意,是分别在两部不同的机器上的)

就算是在客户端运行了一次服务端程序后,运行客户端程序,当服务端程序发消息过客户端,会出现“未知验证类别”的错误(在98上试验),这个时候应该怎么设置dcom的默认属性?
 
把类型库拷贝过来,就可以了。
 
你用dcom连接?
 
to yeath
是的,是用DCOM连接。
考类型库不可以的,因为LoadRegTypeLib是要在注册表上注册了的com,才可以获得typelib,不然是会报“没有注册类”的错误信息。
当时你的程序在两台机器上试验过吗?
 
当然了,注册类型库用
tregsvr进行注册,不过我是用socketconnection进行连接的。
 
哦,明白了,用tregsvr -t xxxx.tlb来注册类库
哪,那个在消息传递的时候,出现的“未知验证服务”,应该怎么解决?
 
那可能是DCom权限配置方面的原因,你用Socketconnection试试,能不能通过?
 
用dcomcnfg在2000的机子设置了权限后,通过了,当时不知道怎么设置98的机子,真是烦死人了
为什么在98上,dcomcnfg的‘预设安全性’那一页,不让我去设置呢,98好像没有分admin和guest的?
 
那搞不清楚,最好不要用98作服务器。
 
其实是这样的,不是用98作服务器,而且,在消息回调的时候,两台机器都必须使用dcomcnfg来设置权限,使得dcom对象能在两台机器间互相访问。
设置98权限非常麻烦,我详细参阅了《分布式多层应用系统篇》的章节后,总算搞掂了
好啦,太感谢yeath的帮助和指引了,和你讨论问题很愉快,这100分都给你吧
 
顶部