COM能不能够推数据?(100分)

  • 主题发起人 主题发起人 沙隆巴斯的主人
  • 开始时间 开始时间

沙隆巴斯的主人

Unregistered / Unconfirmed
GUEST, unregistred user!
在DCOM、COM+里,每次都是CLIENT提出请求,从SERVER拉数据;
有什么好办法由SERVER触发,主动向CLIENT推数据
 
把CLIENT也做成COM不就可以了?
 
为什么要推呢?如果你要推,那么它一定是在作客户端
 
Client端最好是不要写服务的。
如果要退数据,就用Socket.
每个Client端程序运行时都开一个线程用ServerSocket等待接受数据,接到后进行处理,
Server端需要推数据时就使用ClientSocket发向指定Client.
 
如果你使用bcb的话,建立com服务器的时候可以选择添加event的支持,
服务器可以在client端触发自定义的事件,delphi5没看到,d6不知道有没有
 
of course you can,
adding the event support when you create Com server, and create some method for this
event interface, when server want to ask clientdo
some thing, just invoke this method.
in cilent side, add the code below
TEventSink = class(TInterfacedObject, IUnknown,IDispatch)
private
FController: tfm_Snap;
{IUknown methods}
function QueryInterface(const IID: TGUID;
out Obj):HResult;stdcall;
{Idispatch}
function GetTypeInfoCount(out Count: Integer): HResult;
stdcall;
function GetTypeInfo(Index, LocaleID: Integer;
out TypeInfo): HResult;
stdcall;
function GetIDsOfNames(const IID: TGUID;
Names: Pointer;
NameCount, LocaleID: Integer;
DispIDs: Pointer): HResult;
stdcall;
function Invoke(DispID: Integer;
const IID: TGUID;
LocaleID: Integer;
Flags: Word;
var Params;
VarResult, ExcepInfo, ArgErr: Pointer): HResult;
stdcall;
public
constructor Create(Controller: Tfm_Snap);
end;

function TEventSink.QueryInterface(const IID: TGUID;
out Obj):HResult;stdcall;
begin
if GetInterFace(IID,Obj) then
Result := S_OK
else
if IsEqualIID(IID,IMonCliEvents) then
Result := QueryInterface(IDispatch,Obj)
else
Result := E_NOINTERFACE;
end;

function TEventSink.Invoke(DispID: integer;
const IID: TGUID;
LocaleID: integer;
Flags: Word;
var Params;
VarResult,ExcepInfo,ArgErr:Pointer): HResult;
begin
Result := S_OK;
case DispID of
1: begin
ParamCount := DispParams.cArgs;
if ParamCount>0 then
begin
ParamData:=OleVariant(DispParams.rgvarg^[0]) ;
//do something here
end;
end;

end;
end;

constructor TEventSink.Create(Controller: tfm_Snap);
begin
inherited Create;
FController := Controller;
end;

function TEventSink.GetTypeInfoCount(out Count: Integer): HResult;
begin
Result := S_OK;
end;
function TEventSink.GetTypeInfo(Index, LocaleID: Integer;
out TypeInfo): HResult;
begin
Result := S_OK;
end;
function TEventSink.GetIDsOfNames(const IID: TGUID;
Names: Pointer;
NameCount, LocaleID: Integer;
DispIDs: Pointer): HResult;
begin
Result := S_OK;
end;
 
我已经有点头绪了,等我整理完后再公布可行的方法。
 
COM Object的事件和回调技术而已
 
主动向CLIENT推数据 会不会加重服务器负担?本末倒置呢??
~~~~~~~~~~~~~~~~~~~
关注中。。。。。。。[:D]
 
刚好相反,推数据可以减轻服务器负担,因为服务器线程可以自由调度,实现服务器与
客户端的异步连接。MIDAS不就是这样干的吗?
 

Similar threads

后退
顶部