唉,真的是个简单问题,我才发出来就发现 msdn 上写着:
Note Visual Basic does not implement derived classes or interfaces.
请高人们来发表一下意见吧,在这种情况下,一般应该怎么做呢,呜呜呜。前20名发表看法的,up,gz的都有分,分数正比于发表的时间和质量,呵呵。把帖子删除了是不是会扣信誉分,还是用这些分数结交些 COM 高人的好。

解决方案 »

  1.   

    不大可能实现吧。干吗要用VB呢,它不支持QueryInterface,也不支持继承。
      

  2.   

    to arxing(阿行), 我知道啊,用ATL是比较的方便,但有时候用用VB也不错啊。
    VB 可以QI, 象:
    Dim A As IA , B As IB
    Set A = New OA
    Set B = A ' 将调用 QI
      

  3.   

    是不是只能改成下面的样子了,这样好难看啊!
    [object,uuid(),dual]
    interface B : IDispatch
    {
      [id(1),propget]HRESULT base( [out,retval]A* pVal );
      [id(2)]HRESULT mothod2(); 
    };
      

  4.   

    upupupupupupupupupupup
    VB不熟,干吗用VB
    VC也不难呀
      

  5.   

    to  wei97081116(韦小宝):
       我知道 VC 不难,我 VB 虽然不熟嘛但大概还是知道的,呵呵。VC 里有很多的东西不好用的, 象 SAFEARRAY , dispinterface ,即使是 dual 的接口, 象这样的函数 fun( vOpt , vOpt , vOpt , vOpt , vOpt , vOpt , vOpt , vOpt , vOpt , vOpt ..... ) 写的会让人发疯,呵呵,说笑的,我只有看到过 M$ 有这样的接口定义。
       最主要的问题是程序的主体是用 VB 写成的,为了使用以前的东西,我必须使用一些不适于在 VC 中使用的东西,没有办法,这是命啊。
      

  6.   

    VC是可以用SAFEARRAY的。应该说vb能作的vc肯定可以做
    在vb中implement没试过。
    可以贴段代码出来吗?
    关注
      

  7.   

    VC当然可以用 SAFEARRAY, 不过比较麻烦的,象 Array( Array( "a" , 1 , obj123 , Array( 1 , 2 , 3 ) ) , Array(....) ) 把人都要搞的崩溃了,你说我把它改成 struct { string , long , struct { long , long , long }; }; 我用起来是方便了,可是别人不依啊。另外调用 dispinterface 每次都 getidofnames , invoke 也不是个办法啊( 没有tlb, 这是上天的安排 )。
       msdn上写了VB 不能实现 不是从 IUnknown , IDispatch 派生的接口,任何使用了 singed char , unsigned short , unsigned long 等类型的接口。至于代码,你可以就用我最顶上贴出来的试试,加上 uuid 就是完整的定义了,肯定是不行的,我都试过 N ( N>10 ) 次了。不管你 VB 写:Implements A \n Implements B 还是 Implements B 还是别的什么的,只要 Implements B,肯定出错啊。
    idl 大概为:imports....[ uuid( ... ) , version(1.0) ]
    library test
    {importlib....   [object,uuid( ... ),dual]
       interface A : IDispatch
       {
           [id(1)]HRESULT Method1();
       };
       [object,uuid( ... ),dual]
       interface B : A
       {
           [id(2)]HRESULT Method2();
       };
    };   我想我可以把接口这样定义,以下有几种方案,大家给我提提意见,发表自己的看法,大家想想如果自己遇到这种情况会怎么办:
     ** 注 , 以下几点不可改变,这是上天的安排
       # 必须能够用 VB 实现。
       # 必须是 dual 的接口,因为要在脚本中使用。其一:把 interface B 改为从 IDipatch 派生,在 VB 中 Implements A ,Implements B , 用是能用, 不过好像不大方便啊,也不合逻辑。其二:改写 interface B 为:
    [object,uuid(...),dual]
    interface B : IDispatch
    {
        [propget,id(1)]HRESULT baseObj( [out,retval]A** pVal );
        [id(2)]HRESULT Method2();
    };
    然后在 VB 中 Implements A , Implements B , 用是能用,也比上面的方便些,但好像也不是很好, A , B 之间确实是存在派生的关系的 B is A。其三:改写 interface B 为:
    [object,uuid( ... ) , dual]
    interface B : IDispatch
    {
       [id(1)]HRESULT Method1();
       [id(2)]HRESULT Method2();
    };
    然后再 Implements A , Implements B , 改成这样的话,好像要稍微舒服一点,用VB/VC实现都比较的简单,不过写起程序来要稍微麻烦一点,因为 A 中大概有20个左右的方法/属性,VC中当然简单,跟原始的定义相比实现起来也差不多,不过 VB 里满繁的,当然也不是很繁的,不过要写:
    Public Sub B_Method1()
       Call A_Method1
    End Sub
    看起来不是很舒服。我觉得好像是第三种做法要舒服一些,大家觉得怎么样呢,我看 M$ 的MSHTML.TLB 好像就是这样做的,唉,VB还是不舒服啊。
      

  8.   

    呵呵,不是的,一个组件实现两个接口我是知道的。我是说如何用 VB 实现不是由 IUnknown , IDispatch 直接派生而来的接口 或者 怎么样模拟这种实现方式。
      

  9.   

    'first(first.cls)
    Option Explicit
    Public Sub firstmethod()
        MsgBox "first"
    End Sub
    'second(second.cls)
    Option Explicit
    Implements firstPrivate Sub first_firstmethod()
        MsgBox "first_in_second"
    End Sub
    Public Sub secondmethod()
        MsgBox "second"
    End Sub'class1(class1.cls)
    Option Explicit
    Implements second
    Implements firstPrivate Sub second_secondmethod()
        MsgBox "second_in_class1"
    End SubPrivate Sub first_firstmethod()
        MsgBox "first_in_class1"
    End Sub
    'from1(form1.frm)
    Private Sub Command1_Click()
        Dim mcls As Class1
        Dim mfirst As first
        Dim msecond As second
        Set mcls = New Class1
        Set mfirst = mcls
        mfirst.firstmethod
        Set msecond = mcls
        msecond.secondmethod
        Set mcls = Nothing
        Set msecond = New second
        Set mfirst = msecond
        mfirst.firstmethod
        Set msecond = Nothing
    End Sub用vc实现接口也是一样得
      

  10.   

    to tonkeycn(dog):
    请问你的是 second 派生于 first 吗?如果是的话,我试了一下好像不行嘛。
    如果 first 和 second 都派生于 IDispatch 或者是 IUnknown 我知道是可以的.
      

  11.   

    上面这段vb代码应该是没有问题的,second implement first,然后在class1中implement second 不就可以了吗?
    如果用alt的话,在second中implement first,其余和vb是一样的
    要么你做一个小的示例发给我,我来帮你试一下。 [email protected]
      

  12.   

    同名的yahoomessage tonkeycn,可以直接找我。^_^
      

  13.   

    谢谢tonkeycn(dog)先, 上面的 VB 代码肯定没有问题,但是你可能看错了我的要求,你的 VB 程序对应的 idl 说明为:
    [object,uuid(),dual]
    interface _first : IDispatch
    {
    [id()]HRESULT firstmethod();
    };
    [object,uuid(),dual]
    interface _second : IDispatch
    {
    [id()]HRESULT secondmethod();
    };
    [uuid()]
    coclass first
    {
    [default]interface _first;
    };
    [uuid()]
    coclass second
    {
    [default]interface _second;
    interface _first;
    };_first , _second 都是从 IDispatch 派生的,而不是 _second 派生于 _first,再次感谢。[email protected] ,以后多多联系
      

  14.   

    up,gz
    两个都写了,快给分,赫赫
    只要是COM/CORBA有关的,发到这儿偶都不会删,放心吧,不过有没人回答就靠你的运气啦