用CreateObject("myCom.myInterface")也无法创建,请高手指点!

解决方案 »

  1.   

    实现了双接口没有?支不支持IDispatch?我也不是太懂,只是提醒你一下
      

  2.   

    to  flywolfman() :
     为什么?
      

  3.   

    接口从IDispatch继承而不是从IUnknown
      

  4.   

    >to  flywolfman() :
    > 为什么?因为VB需要调用IDispatch中的GetIDsOfNames方法来得到这个组件的函数列表,要调用IDispatch中的Invoke来调用这个组件里的函数。
      

  5.   

    谢谢大家,特别是kichu和puppet,我清楚要使VB或脚本中能调用必须从idispatch接口继承,并实现双接口,其实说到底,正象是kichu说的,是为了使用Idispatch的GetIDsOfNames和Invoke函数。
    COM提供一个叫CLSIDFromProgID的函数,它根据给出的ProgID查找CLSID。VB或脚本用"CreateObject"调用这个函数,然后Visual Basic调用我们的最熟悉的CoCreateInstanceEx,传送CLSID和请求IDispatch接口,IDispatch::GetIDsOfNames获得与方法或属性的文本名有关的整型ID,也就是双接口定义的IDL文件中的id(1)类似的东东。
    而IDispatch::Invoke接收一批参数,所有现行的自动化属性和方法访问都是通过调用IDispatch::Invoke实现的。以上是小弟对自动化双接口的一些理解,可是我最想问的是,如果我不是直接从Idispatch继承,而是某个已经实现双接口的对象(如XMLDocument)继承,我的IDI是否只需将Idispatch接口改成我所需要的对象接口就可以?
      

  6.   

    >如果我不是直接从Idispatch继承,而是某个已经实现双接口的对象(如XMLDocument)继承,我的IDI是否只需将Idispatch接口改成我所需要的对象接口就可以?看不太懂你这句话.....COM对象好象不能继承吧.....
    也许你要做的是聚合....把对IDispatch的QueryInterface调用传给你内部的XMLDocument的instance.....
      

  7.   

    VB使用的组件不必是 IDispatch 的,但脚本语言中必须是。注意你使用的数据类型 不能是 signed char , unsigned short , unsigned long 这样的函数不能在 VB 中使用,包含了这些数据类型的接口不能由 VB 实现 但VB 可以使用这样的接口(当然不能使用包含了这些数据类型的函数)。>>而是某个已经实现双接口的对象(如XMLDocument)继承
    可以的,但VB只能使用这样的接口,不能实现,这个我可是用100分买的教训,idl 中象下面的写就行了:
    [object,uuid(...),dual]interface IYourInterface : IXMLDocument{};>>CreateObject("myCom.myInterface")无法创建
    这个根是否 IDispatch 接口没有关系,应该是你的progid错了,或者是你的程序没有正确地注册。根据你上面列出来的情况,你的程序确实没有注册类型库,你用oleview看看你的 dll( exe ), 或者你用 VC 把dll(exe)当作资源打开看看是不是有类型库,你的对象是怎么实现的,难道是用这种最古老的办法:
    interface IYourInterface : public IXMLDocument
    {
       STDMETHOD(method1)() PURE;
    };
    我想应该不会吧。
      

  8.   

    kicku你说的对,应该是聚合……
    目前我找到了部分问题,(1)DisPatch接口的GetTypeInfoCount,GetTypeInfo我写的有问题,GetIDsOfNames,Invoke。
    (2)注册表写的不对,(因为考虑到平台,没有用MFC和ATL,所以注册表得自己写),应该不仅在CLSID子键中,还要在TypeLib子键中,以及组件名写在HKEY_CLASSES_ROOT下,三者通过ProId联系起来。这是为了在脚本中用CreateObject("yourCom")调用(3) 还有正象LLnju说得那样,我的类型库没有加入工程。:P经过以上修正后,我的DLL可以成功注册,在VB中“工程->引用”中可以看见,用OLEView已经可以看见所有我希望看到的方法和属性,在VB中可以New这个组件的接口对象,可是在调用方法或者设置属性时,VB程序会出错“自动化错误”,错误号0x80040110,用VC的Error Lookup查错误解释为"类不支持 aggregation (或类对象为远程对象) "。
    LLnju,不好意思,因为我希望用户可以完全象用IXMLDOMDocument一样用我的组件,所以我用的真是这种方法,撇开ClassFactroy等的具体实现,实际上我是在创建组件是New一个IXMLDOMDocument,在用户调用相应接口方法时,我调用相应的IXMLDOMDocument接口方法,改写后返回。土是土了点(而且可能有问题)可这也是没有办法的事情,你看看msxml2.lib,该死的W3C没有加入函数库,我能咋办?看来你是高手啊,谢谢你的提示,我还真不知道“数据类型 不能是 signed char , unsigned short , unsigned long”呢?
    请继续提示,我的问题就是以上,而且目前在VC环境下运行无误,可是用VB调用就是不行,难道在Invoke函数上还有什么猫腻吗?
    请高手们帮助!!!
      

  9.   

    我也是初识COM、一点提示
    为了让VC中的写的东西到VB,SCRIPT等中使用,你必须对所调用的方法中的参数加以限制,也就是参数类型必须是automation中所规定的
      

  10.   

    实现了自动化的COM,宿主文件类型为Service(EXE),添加接口函数,把如下结构作为函数参数返回给调用它的客户程序,用什么数据类型呢?
    SafeArray好象成员类型要相同,VARIANT类型行不行? 怎么实现呢?
    struct INFO
    {
    WORD Type;
    BYTE Month;
    BYTE BoardID;
    };