我用了一个第三方的com组件,下面是其中一个对象Terminals在类型库中的相关信息:
[
  uuid(AA7720C1-F1BA-11D1-B856-E4C106503E47)
]
coclass Terminals {
    [default] dispinterface ITerminals;
};[
  uuid(AA7720C0-F1BA-11D1-B856-E4C106503E47)
]
dispinterface ITerminals {
    properties:
    methods:
        [id(0x00000001)]
        long GetCount();
        [id(0x00000002)]
        IDispatch* GetActiveTerminal();
        [id(0x00000003)]
        IDispatch* GetItem(long index);
};从上面可以看到,这个对象实现ITerminals中的三个方法:
GetCount()
GetActiveTerminal();
GetItem(long index);
奇怪的是,在VB中调用的时候不能照搬原来的名称,必须把前面的get去掉,分别换成Count,ActiveTerminal,Item才行,而在delphi/BCB中使用的时候,必须用类型库中的名称进行调用.我不明白这是为什么,这可能涉及到不同的开发环境支持COM的机制的差异,哪位高手知道,请不吝赐教!

解决方案 »

  1.   

    可能正如上楼所说吧。
    vb一般都是直接调用属性的,所以不用Get。
      

  2.   

    名字转换方式不同??VB作了这个转换吗?我从何处可以看到这个转换呢?
    倘若是VB做了转换,那么总要有一个转换的规则吧,把get打头的方法名前面的Get去掉,这算什么规则呢?
    而且,也并不是所有get打头的方法都作了这个转换呀。
    实在想不明白!
      

  3.   

    属性在MFC的封装类中的表示方法是Get/Set+属性名
    在使用#import生成的智能指针封装类中的表示方法是属性名(根据上下文自动判断调用Get/Set方法)和Get/Set+下划线+属性名
    在VB中是根据上下文自动判断调用Get/Set方法。
      

  4.   

    那么为什么我在VB中直接调用GetCount()这个方法反而不行呢?错误提示为:对象不支持此属性或方法难道VB中对com的调用全靠自己"智能识别",与类型库中定义的名称无关吗?
      

  5.   

    因为属性的名字是Count,get/set是在C++里面生成封装类的时候自动加的
      

  6.   

    可是从类型库来看,类中并没有任何的属性,这三个都是方法,VB如何把get变没了呢?VB这东西真是非常的怪异,强烈排斥VB!
    看来想得到确切的答案没多大希望了,过几日就派分
      

  7.   

    类型库的dispinterface信息并非原始IDL的内容.
    原始定义在Interface.
    --------------------------------------------------
    你所贴的内容是被翻译的了.原版应是properties.--------------------------------------------------
    并非VB的错,是你看走眼了.