紧急求救:APServer回调Client时产生异常:“应用程序调用一个已为另一个线程整理的界面”

cfm999 2002-08-16 09:48:03
环境:win2000(Server and Client), COM+, Delphi 5

(win98,MTS, D5时没问题)

我的分用不完,不够再加.
...全文
86 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
cld 2002-08-28
  • 打赏
  • 举报
回复
对不起,几天没上网,我也不能解决你发现的问题,我觉得要不你还是考虑一下你的控件的套间模型的问题,祝你好运。
cfm999 2002-08-28
  • 打赏
  • 举报
回复
我已经找到了一个笨法解决,多谢关注,以后还要向你请教!

我在10:00前已经结帖了,在贴尾无结帖标志,一般的浏览也看不见,但在管理中能看到
你在8-24 12:47:11回复得分100,不知你收到分否?
cld 2002-08-24
  • 打赏
  • 举报
回复
对不起,我使用的是VC,不是DEPHI,那么我猜测的说一下吧。但是从COM的标准来说,回调的实现必须通过传递一个回调接口的指针来完成,不能简单的通过传递一个函数的指针来实现,我觉得你应该将必须回调的函数封装在一个接口中,TmtsClient支持这个接口,将该接口的指针传递给TmtsServer,大概能解决问题。
cfm999 2002-08-24
  • 打赏
  • 举报
回复
我传递的是接口:IDispatch

constructor TmtsClient.Create;
..
begin
...
mtsServer.SetCallBack(Self as IDispatch);
...
end;

哎,主要还是我对COM不懂,也没时间学就开做,
结果倒误事了。
cfm999 2002-08-22
  • 打赏
  • 举报
回复
to cld(陈雷动): 多谢!

我的使用如下:

环境:win2000(Server and Client), Com+, Delphi 5
(win98,MTS, D5没问题)

TmtsServer = class(TMtsAutoObject, ImtsServer)
private
{ Private declarations }
FCallBack: OleVariant;
protected
{ Protected declarations }
procedure SetCallBack(vCookie, vCallBack: OleVariant); safecall;
procedure GetData(out vData: OleVariant); safecall;
public
{ Public declarations }
Destructor Destroy; override;
end;

procedure TmtsServer.SetCallBack(vCallBack: OleVariant);
begin
try
FCallBack := v;

SetComplete;
except
SetAbort;
raise;
end;
end;

procedure TmtsServer.GetData(out vData: OleVariant); safecall;
begin
try
FCallBack.SynchNotify; //出错,回调不了


vData := ...

SetComplete;
except
SetAbort;
raise;
end;
end;


Client端:

type
TdmAccess = class(TDataModule)
procedure DataModuleCreate(Sender: TObject);
private
{ Private declarations }
FmtsClient: TmtsClient;
FmtsServer: ImtsServer;
public
{ Public declarations }

end;

TmtsClient = class(TAutoIntfObject, ImtsClient)
protected
procedure SynchNotify; safecall;
public
constructor Create; overload;
end;

procedure TdmAccess.DataModuleCreate(Sender: TObject);
var
vData: OleVariant;
begin
FmtsClient := TmtsClient.Create;
FmtsServer := ComtsServer.CreateRemote(g_strServerHost);

FmtsServer.GetData(vData);
end;

constructor TmtsClient.Create;
var
mtsSever: ImtsServer;
tlb: ITypeLib;
begin
OleCheck(LoadTypeLib('C:\CallBack.TLB', tlb));

inherited Create(tlb, ImtsClient);

mtsServer := ComtsServer.CreateRemote(g_strServerHost);
mtsServer.SetCallBack(Self as IDispatch);
end;

procedure TmtsClient.SynchNotify; safecall;
begin
...
end;


引发我的错误已找到,就是:
(1) ImtsClient传递到Server.SetCallBack(此时可以回调),
此时Marshal, 结束本次调用。
(2) Server.GetData被调用(也可能是另一个Client),此时
Unmarshal,可以回调。

现在的问题是:
ImtsClient要重复使用,如何保存Marshal后的IStream???


cld 2002-08-20
  • 打赏
  • 举报
回复
具体的讲一下您的DLL的套间模型是什么?

604

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 控件与界面
社区管理员
  • 控件与界面社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧