关于回调 求解... 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 回调机制在分布式多层应用中是相当重要的,的确,我们可以能过心跳机制实现同样的原理,但那样会浪费很大的资源;网络的握手、广播、无用数据的传递等;那么到底是什么是回调机制?其实,并不完全是回调机制,可以由服务器强制对客户应用程序进行某一特定事件的触发;请主意一点是,如下: ICallBack_SL = interface; ICallBack_SLDisp = dispinterface; ISL = interface; ISLDisp = dispinterface;/////////接口需要用Dispinterface;远程数据模块unit ServerRDM;{$WARN SYMBOL_PLATFORM OFF}interfaceuses 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;interfaceuses 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. For循环中弹出验证码窗体后如何执行下面代码? 是用delfphi做还是用SQL SERVER做?? 哪位老大帮我解决一下串口读写问题! ADOQuery.Parameters问题 TdxDBGrid 什么地方有下,,急呀!!!!! 求一个delphi系统时间函数! 50分也~~~~ 如何判断一个maskedit里有不有空格? VXD乍用?? 一个给极富挑战性编程难题!!! delphi里结束语end问题????????????? 在多层结构中如何在服务器端回调客户端的过程或函数??? 救命!!关于word与olecontainer的问题,在线等待!!
那么到底是什么是回调机制?其实,并不完全是回调机制,可以由服务器强制对客户应用程序进行某一特定事件的触发;
请主意一点是,如下:
ICallBack_SL = interface;
ICallBack_SLDisp = dispinterface;
ISL = interface;
ISLDisp = dispinterface;/////////接口需要用Dispinterface;远程数据模块
unit ServerRDM;{$WARN SYMBOL_PLATFORM OFF}interfaceuses
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;interfaceuses
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.