用Delphi开发中间件,经常出现interface not supported 错误(200分)

  • 主题发起人 penPower
  • 开始时间
P

penPower

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大哥:
小弟最近在用Delphi 做三层结构,客户端和中间件之间用MTS/com 连接。
但在调试中多次出现“interface not supported"或”远程访问失败"或“RPC错误”。
我是在客户端上开发的中间件(com组件)和客户端程序,com组件在服务器的
组件服务中安装后导出客户端代理,在客户机上安装。没有使用MIDAS等控件。感觉客户端代理的安装有一定效果,
但仍然频繁出现以上三个错误。小弟在网上查了不少资料,发现这个问题非常普遍,大富翁上有不少说法,不过没有定论,我试过,还是不能彻底解决问题。
如果那位大哥有这方面的开发经验,能为小弟答疑解惑,小弟当然感激莫名,解决方法可在论坛上发表,也可以直接发送到我的邮箱penPower@chinaren.com,谢谢!
另外也欢迎Delphi程序员和我联系,一起探讨技术问题,我在MSG有帐号 penggang@moneywise.com.cn ,发邮件也行
只有200分,问题比较棘手,全数奉上。
 
D5?
听说这方面D6较好,记得打补丁.
 
能详细介绍你的三层的做法吗?
比如,中间层用MTSObject或是Automation Object还是用Remote Data Module做的
中间层是in-process还是out-of-process
有没有用MTS,或是W2K下的COM+?
我一般的做法是:
中间层用in-process,先New一个ActiveX library,再加Automation object,
完成automation object的方法的代码后,在component services中建立一新应用程序。
然后增加组件将刚才的DLL里的对象注册。
至于客户程序,我在客户Application中将上面DLL Project中的那个_TLB.pas的单元
增加到Project中,在需要调用对象的单元上Uses这个单元,就可以调用_TLB.pass中包含对象了。
在客户端运行客户程序之前,在component services中的COM+应用程序导出,在客户端运行
以后就可以运行客户程序了。
我的做法都没遇到象你说的这些问题,如果你和我详细讨论的话,我想我应该可以帮到你。
 
使用的是delphi5+pack1
中间层用MTSObject
中间层应该是in-process,因为是dll
我的做法是:先New一个ActiveX library,再加MTS Object,Thread用Apartment,Transaction用
Require a transaction
以下和你用的是一样的 :
完成MTS object的方法的代码后,在component services中建立一新应用程序。
然后增加组件将刚才的DLL里的对象注册。
至于客户程序,我在客户Application中将上面DLL Project中的那个_TLB.pas的单元
增加到Project中,在需要调用对象的单元上Uses这个单元,就可以调用_TLB.pass中包含对象了。
在客户端运行客户程序之前,在component services中的COM+应用程序导出,在客户端运行
以后就可以运行客户程序了。
问题是间歇性的,我接触Com 技术大约一个月时间,在这段时间我写了很多例子,有一段时间
我还以为以上问题已经解决了,但是在同样条件下它又冒出来了,而且我们在很多机器上做了测试。
昨天就是,客户端和程序都没动,有些客户端可以访问,另一些不能,我的电脑
昨天不能访问,今天
就成功了。
MY God ,想这样我们那敢拿到客户那儿去哦,难道还是回去用C/S 系统?
 
能找出出现错误有规律吗?
 
没什么规律
因为在客户代理和程序都不变的情况下,不同时间段就不样
如果是概率分布的话也就罢了,但是是一段时间成功一段时间失败
我想会不会是Delphi5 的MTS向导有问题?因为我发现国外查对这
种问题的讨论比较少,同事以前在VB下开发也没有遇见这个问题。
 
Ixxx(IDispatch(Connection.GetServer)).youMethod
 
确实很奇怪,我从来没遇过这种问题。
 
wlmmlw 说的是用Dcomconnection 吗?
我没用MIDAS那一套东西,就是怕Delphi封装后出现问题我们无法控制
 
yhaochuan
你用了多久时间了?是不是在单机上测试的?单机上点问题都没有,
即使用CreateRemote(本机名),换成远程就玄了
 
CreateRemote有不敢去用,我的客户程序引用了_TLB.pas而已,
然后就用
procedure form1.neworder;
var order:Iorder
begin
order := CoOrder.Create;
order.neworder('orderid', 'ordername');
end;
我的客户端程序全这样用。
如果要请求返回数据,用法则:
procedure form1.getorderno;
var
order:Iorder;
orderno:string;
begin
order := CoOrder.Create;
order.getorderno('orderid', orderno);
end;

不管程序在哪里运行,我先在那台电脑运行COM+导出的XXX.MSI
然后就跑客户程序,好象我实现得很简单:)
 
在*_TLB.Pas中有定义
CoOrder = class
class function Create: IclsMTSData;
class function CreateRemote(const MachineName: string): IclsMTSData;
end;
用 order := CoOrder.Create;
是在本地建立一个com 对象,
三层结构为实现瘦客户端,中间件是和客户端一般是两台电脑上,客户端访问
中间件就只有调用CreateRemote建立DCom的实例,用Create....没道理啊
 
看来问题应该是在这里了。
我想COM+导出应用程序代理在客户端上运行的目的就是告诉客户操作系统
如果有程序请示调用这样的过程,那么系统自动连接到COM+服务器电脑
以完成分布计算。这样你调用CREATE的时候,它会在服务器上建立这个控件,
而不是那台客户电脑上建立。
你试试吧,没错的。上面的说的不大专业,大概意思你应该明白吧。
 
有可能,但我还是有一些疑惑,因为如果你说的是对的话,
那CreateRemote方法又有什么用途呢?
我先看看书,或做个实验就行了。因为按照客户端代理后系统在
c:/program files/complus Applications/下添加了一个中间件的副本,我想
用Create方法有两种可能,一种是访问服务器端的中间件,一种是访问客户端的
副本。我在中间件中加入在磁盘写入文件的功能,就知道调用的是那儿的业务逻辑了。
 
我试了一下,果不其然,当在另一台客户端调用写有i:=CoclsMTs.Create;的客户端程序
时,“报类没有注册”错误。
 
不是你错了就是我错了,错得很厉害[:D]
 
不过用CreateRemote 的客户端程序在安装了客户端代理后还是没有调用成功,
先蓝屏(win98),然后报“远程调用失败",没语言
 
你用的客户端是不是也是开发中间件的电脑,你把客户端放到其他电脑上试试?
先发些分,感谢大家的热情解答
 
哦,只有完成后才能发分说,Sorry
 
强烈建议使用D6+WIN2000
我是这样的~
 
顶部