none
为什么编译的时候总是报错Type Mismatch呢?麻烦大家帮我找下原因,谢谢。 RRS feed

  • 问题

  • 我是VB菜鸟。我想尝试在VB 6.0里调用.NET生成的COM interop。

    Interop的IDL如下:

    [
          uuid(68CEA3DE-3EFE-31FD-A66E-58D5D6C4D722),
          version(1.0),
          custom(0F21F359-AB84-41E8-9A78-36D110E6D2F9, MarshalStructure.DataClass)
        ]
        coclass DataClass {
            [default] interface _DataClass;
            interface _Object;
        };

        [
          uuid(0071D866-9205-3F07-B751-121746580E12),
          version(1.0),
          custom(0F21F359-AB84-41E8-9A78-36D110E6D2F9, MarshalStructure.MarshalClassObj)
        ]
        coclass MarshalClassObj {
            [default] interface _MarshalClassObj;
            interface _Object;
        };

        [
          odl,
          uuid(73BB93A1-5576-3ECF-A4B1-05F974712F9F),
          hidden,
          dual,
          nonextensible,
          oleautomation,
          custom(0F21F359-AB84-41E8-9A78-36D110E6D2F9, MarshalStructure.DataClass)    

        ]
        interface _DataClass : IDispatch {
            [id(00000000), propget,
              custom(54FC8F55-38DE-4703-9C4E-250351302B1C, 1)]
            HRESULT ToString([out, retval] BSTR* pRetVal);
            [id(0x60020001)]
            HRESULT Equals(
                            [in] VARIANT obj, 
                            [out, retval] VARIANT_BOOL* pRetVal);
            [id(0x60020002)]
            HRESULT GetHashCode([out, retval] long* pRetVal);
            [id(0x60020003)]
            HRESULT GetType([out, retval] _Type** pRetVal);
            [id(0x60020004), propget]
            HRESULT IntegerValue([out, retval] long* pRetVal);
            [id(0x60020004), propput]
            HRESULT IntegerValue([in] long pRetVal);
            [id(0x60020006), propget]
            HRESULT StringValue([out, retval] BSTR* pRetVal);
            [id(0x60020006), propput]
            HRESULT StringValue([in] BSTR pRetVal);
        };

        [
          odl,
          uuid(7E762220-9D47-3C85-AC67-FA9935AFBFAB),
          hidden,
          dual,
          nonextensible,
          oleautomation,
          custom(0F21F359-AB84-41E8-9A78-36D110E6D2F9, MarshalStructure.MarshalClassObj)    

        ]
        interface _MarshalClassObj : IDispatch {
            [id(00000000), propget,
              custom(54FC8F55-38DE-4703-9C4E-250351302B1C, 1)]
            HRESULT ToString([out, retval] BSTR* pRetVal);
            [id(0x60020001)]
            HRESULT Equals(
                            [in] VARIANT obj, 
                            [out, retval] VARIANT_BOOL* pRetVal);
            [id(0x60020002)]
            HRESULT GetHashCode([out, retval] long* pRetVal);
            [id(0x60020003)]
            HRESULT GetType([out, retval] _Type** pRetVal);
            [id(0x60020004)]
            HRESULT CreateInstance([out, retval] _DataClass** pRetVal);
            [id(0x60020005)]
            HRESULT UpdateInstance([in, out] _DataClass* obj);
        };

    VB的代码很简单:
    Dim g As MarshalClassObj
    Dim o As DataClass
    Set g = CreateObject("MarshalStructure.MarshalClassObj")
    Set o = g.CreateInstance
    g.UpdateInstance(o)  


    用到的函数和过程的签名:
    Sub UpdateInstance(obj As DataClass)
    Function CreateInstance() As DataClass

    Mismatch的编译错误出现在g.UpdateInstance(o) ,我debug进去了,o是一个DataClass啊,不知道为什么编译总是通不过。麻烦大家帮我看看吧。谢谢了。

     

    2010年5月1日 13:41

答案

全部回复

  • 你好!

         你调用的是g的UpdateInstance()方法,g是MarshalClassObj,而 MarshalClassObj类的 pdateInstance()方法的原型是

    HRESULT UpdateInstance([in, out] _DataClass* obj);

         和你传递的参数类型不符合!


    周雪峰
    2010年5月2日 7:13
    版主
  • 你好!

         你调用的是g的UpdateInstance()方法,g是MarshalClassObj,而 MarshalClassObj类的 pdateInstance()方法的原型是

    HRESULT UpdateInstance([in, out] _DataClass* obj);

         和你传递的参数类型不符合!


    周雪峰
    Thanks. 那正确的调用应该是什么呢?
    2010年5月3日 4:41
  • 再借VB版宝地问一下,MSDN论坛有.NET和COM互操作的讨论版么?我好像没搜到。谢谢。
    2010年5月3日 4:44
  • 你好!

         并没有分的这么细,你可以放到.NET Framework一般讨论区板块!


    周雪峰
    2010年5月3日 6:01
    版主
  • o=g.UpdateInstance(o)  
    http://feiyun0112.cnblogs.com/
    2010年5月6日 7:05
    版主