有关三层结构中服务器到客户端的回叫(200分)

S

shaver

Unregistered / Unconfirmed
GUEST, unregistred user!
我的一个三层结构应用程序中需要用到回叫机制。
我采取的办法是在接口文件(相关的XXX_TLB文件)中定义了一个回叫的接口。
IServerCallback = IntegerFace
[...]
procedure OnQueryed(ChackResult : TCheckResult);safecall;
end;
在客户端实现此接口,并且在客户端主程序的CREATE事件中CREATE此接口的实现类。
TServerCallback = class(TAutoIntfobject,IServerCallback)
procedure OnQueryed(CheckResult : TCheckresult);safecall;
end;
...
Constructor TmainFormCreate(Sender : TComponent);
var
callback : IServerCallback;
Typelib : tTypelib;
begin
Olecheck(loadRegTypelib(XX,XX,XX,Typelib));
callback := TServerCallback.create(Typelib,XX);
end;
...
在调用服务器方法时将Callback传过去
Query(callback);...
服务器在Query方法的实现中接受此Callback,并且在需要时回叫。
var
Fcallback : IServerCallback;
...
Fcallback := nil;
...
procedure TServerQuery(callback : IServerCallback);
begin
FCallback := Callback;
//if FCallback <> nil then
!!!此处调用一点问题都没有
// callback.Onqueryed(CR_OK);
end;
.....
其它方法中则问题出来了
....
if FCallback <> nil then
!!!此处调用出错
callback.Onqueryed(CR_OK);
....
服务器端出现错误提示:消息过滤器拒绝调用
请"有识之士"帮忙找一下问题所在,先致谢意!!!
shaver
 
Onqueryed里面做了什么事情?
连接点本身是正确的
 
我在onqueryed之中所做的只不过是将服务器端的处理结果CR_OK显示给使用者.
错误提示是出在服务器的,之后根本没有进行Callback的动作.
 
你在调用远程服务器的Query时传递了一个本地的接口指针。在调用函数时,COM环境
给你作了一下包装(Marshing),但是当你把这个值保存下来下次调用时,COM无法恢复
上一次的调用环境。但是如何解决我需要再研究一下!
 
问题我已通过其它途径解决,感谢二位的解答.
huazhb的分析我回头会证实一下.
 
顶部