为什么用DCOMConnection连接中间层,客户端也需要配置DCOM?

xhai 2004-07-02 03:04:37
现在我用一个DCOMConnection连接中间层,在服务器端配置了DCOM,错误提示是:INTERFACE NOT SUPPORTED,后来我在客户端也配置了DCOM后,就可以正常运行了。如果非要这样的话,我有20多台客户机,哪不是很麻烦。各位大虾有没有好的办法帮帮小弟???小弟急着交差。问题解决马上放分。
...全文
239 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
JavaD 2004-07-02
  • 打赏
  • 举报
回复
不用哈,
xhai 2004-07-02
  • 打赏
  • 举报
回复
问题已经解决,现在放分。多谢JavaD(一竿残照)
JavaD 2004-07-02
  • 打赏
  • 举报
回复
那就没有问题
xhai 2004-07-02
  • 打赏
  • 举报
回复
我用的是Apartment啊。这样应该没有错啊。
JavaD 2004-07-02
  • 打赏
  • 举报
回复
那要看你的com+是什么类型的,如果是single的化,就是单对单,如果是ApartMent就不是,
建议com+写成无状态的对象,这样才能使用com+的池化
xhai 2004-07-02
  • 打赏
  • 举报
回复
用这段代码时,当我在一个客户机上申请锁定时成功,在没有解锁的情况下,在别的客户机上申请不成功,这里没有问题;只是当我在前一个客户机按下解锁以后,再到后一台客户机申请锁定功能,可返加值还是false,但如果在前一台客户机上再次申请锁定时,返加true.这是为何?
xhai 2004-07-02
  • 打赏
  • 举报
回复
多谢楼上的这么帮忙,按哪种安装com+代理的方法,问题已经解决了。能否再问你一个问题:中间层在维护数据的时候,是否为每一台客户分别维护一个。
例如:我的中间层是完成锁定一张单据的编辑功能。也就是说,当有一台客户机申请锁定一张单后,别的所有的客户机都不能再锁定这张单据,只有当前这个客户机解锁以后,别的客户机才能申请锁定这张单。
我的中间层申请锁定的功能代码如下:
procedure TRDM_PaperRequestLock.RequestLock(iBillType: Integer;
const sBillID: WideString; out bLocked: OleVariant);
var
hHandle:HWND;
bOutLocked:Boolean;
bOK:boolean;
begin
//单据加锁仲裁
bOutLocked:=False; // 初始化加锁标示
hHandle:=CreateMutex(nil,True,Pchar(IntToStr(iBillType)+sBillID)); //创建互斥对象的功能
try
{ while (GetLastError()=ERROR_ALREADY_EXISTS) do
begin
Sleep(100);
hHandle:=CreateMutex(nil,True,Pchar(IntToStr(iBillType)+sBillID));//创建互斥对象的功能
end; }
if WaitForSingleObject(hHandle,0)<>wait_TimeOut then //过程没有被运行过
begin
with frmPaperRequestlock.cdsLockRec do
begin
//在内存表中查找,请求仲裁的记录,
if Locate('iBillType;sBillID',VarArrayOf([iBillType,sBillID]),[]) then
begin
//若批到需要仲裁的记录,则判断此记录是否已经锁定,
if FieldByName('bLocked').AsBoolean=True then
begin //当前记录已经被锁定,则返加False
bOutLocked:=False;
end
else //当前记录没有被锁定,则修改此记录的加锁标示为True,并且返加True
begin
Edit;
FieldByName('bLocked').AsBoolean:=True;
post;
bOutLocked:=True;
end;
end
else //若没有找到则添加新记录,
begin
Append;
FieldbyName('iBillType').AsInteger:=iBillType;
FieldByName('sBillID').AsString:=sBillID;
FieldByName('bLocked').AsBoolean:=True;
Post;
bOutLocked:=True;
end;
end;
end;
finally
bOK:=ReleaseMutex(hHandle);
bLocked:=bOutLocked;
end;
end;

//解锁代码:
procedure TRDM_PaperRequestLock.ReleaseLock(iBillType: Integer;
const sBillID: WideString);
begin
//释放加锁标示
with frmPaperRequestLock.cdsLockRec do
begin
if Locate('iBillType;sBillID',Vararrayof([iBillType,sBillID]),[]) then
begin
Edit;
FieldByName('bLocked').AsBoolean:=False;
Post;
end
end;
end;
JavaD 2004-07-02
  • 打赏
  • 举报
回复
com就是这样,没有办法的
xhai 2004-07-02
  • 打赏
  • 举报
回复
楼上说的哪一贴,等这个问题解决后一起给分,楼上等啊。
JavaD 2004-07-02
  • 打赏
  • 举报
回复
如果不想麻烦,可以再写一层webService来访问com+,客户端访问webService,这样可以过防火墙,而且不用同事分发com+的代理
JavaD 2004-07-02
  • 打赏
  • 举报
回复
你的那贴http://community.csdn.net/Expert/topic/3140/3140240.xml?temp=.4952814也该给分了吧
JavaD 2004-07-02
  • 打赏
  • 举报
回复
因为com的机制要求客户端用代理stub来调用,
就是这样:
客户端->com+ stub->服务器上的com+组件
你可以把服务器上com+组件导出一个客户端安装包,在客户端安装一下就好了

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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