(DCOMConnection1.AppServer as IDMDOMtest).getinfo(text);---early binding(100分)

  • 主题发起人 主题发起人 海之魂
  • 开始时间 开始时间

海之魂

Unregistered / Unconfirmed
GUEST, unregistred user!
为什么编译时老是出错啊??
Operator not applicable to this operand type
late binding 和 dispatch table 均没问题
谁能贴一下相关的源码?(全部)
 
记得要分两步cast:
((DCOMConnection1.AppServer as IDispatch) as IDMDOMTest).GetInfo(...)
 
或者IDMDOMTest(DCOMConnection1.AppServer ).GETINfo()
 
没有明白为什么需要Binding,在普通的Client直接用AppServer即可。敢问这段代码出自
何地,可否让我一瞧
 
我试了,你们说的还是不行,这个例子来源于李维的DELPHI 5.x分布多层
他的代码是(DCOMConnecttion1.GetServer as IrdmDemo3).GetSystemInfo();
我试了一下:
1)说不得IrdmDemo3无法识别.
2)我uses了***_LIB.pas后,就Operator not applicable to this operand type了
另外他下面的
OleCheck(LoadTypeLib('puperserver.tlb',servertlb));中的servertlb是什么变量,
名字是随便起的吗
 
Up,海之魂老兄的问题就是我的问题,而且uses ***LIB.pas后还是有问题的,比如原来
一个函数的参数是oleVariants,那么我原本是采用Appserver的方式得我话传入Variants就
可以了,现在用dispatch table 后就老是提示类型不匹配,把其改成oleVariants后
一运行就出错,晕倒
 
在客户端程序中点击“Project -> Import Type Library”菜单,选中你要用的组件名称,
确定之后,再点击“File -> Use Unit”,引用接口单元,就可以使用Early Binding了,
而Late Binding却没有这些步骤,它在运行时通过Varaint转换接口,所以不需要让编译器
知道接口的类型,但这样的效率较低。
servertlb大概应定义为ITypeLib类型(否则编译不过)。
 
这样来调用com中接口的方法:
var
iServer:IDMDOMTest;
begin
iServer := coCoServerClass.CreateRemote('Servername') as IDMDOMTest;
iServer.GetInfo(...)
end;
 
To 知足者:
这样做主要是提高效率,加快连接速度,李维的系统篇中有讲。
To lld:
一步到位就可以,我的可以。
To 海之魂:
源码都是一样的,我的就成功了。
  early binding的几个关键地方:1、一定要是TDCOMConnection不能是TSockconnection.
2、把中间层的AppSvr_TLB.pas加入到客户端的工程中,且在相应的单元引用。
                 3、你的IDMDOMtest接口要正确。
  
 
应该是这样:
(IUnknown(DCOMConnection1.AppServer) as IDMDOMtest).getinfo(text);
我也不知为什么要这样,DELPHI。
 
uses了***_LIB.pas,会现很多麻烦的,早绑定比晚绑定要好。
 
TO:billrobin
uses了***_LIB.pas 会有些什么样的麻烦?
我就是用这种办法,暂时还没遇到啥问题! 但心里还是没底!!!!![:(]
 
uses了***_LIB.pas 后,您需要在客户端运行应用服务器对不对?问题比较多。出一些莫名
的问题很难处理的。我现在改成appserver方式。就完全没有以前出的现象了。
 
改成这样,用xxDisp接口去访问方法:
IDMDOMTestDisp(DCOMConnection1.AppServer).GetInfo(...)
否则就必须用
Server := xxComFactory.Create;
Server.GetInfo();
 
后退
顶部