我在VC。NET中用建立了一个ATL的DLL程序,在接口中加入了两个结构A,B。A中包括了一个B[10]的成员。又定义了一个函数FUN([in,out]A* a);在此函数中对a的成员进行了复值,(包括对B[10]数组的复值),编译后,在VB。NET中引用了此DLL,然后定义了一个A的对象,public a as new A,然后调用函数FUN(a).调用时发生了异常TypeLoadException,说无法封送A中的结构B。我又作了其它的试验,发现如果A中只有一个B类型的成员,而不是B[10]的数组成员,就可以正确调用。而且这样的写法在VC中做得DLL在VB中调用是正常的,但是当升级到VC。NET和VB.NET中就发生了异常,该怎样解决呢?

解决方案 »

  1.   

    《IDL精髓》说:数组传送必须显示指定其长度,而你在A中隐藏了一个数组,COM在封装类A时,B[10]只是被封装成一个指针数值[32位整数],调用时(特别是跨语言时,有一个WRAPPER做中介)当成数组来使用,当然会出现异常了(即使经过列集)。所以你必须显示指定其长度。
      

  2.   

    HRESULT forexample([in]LONG nItem,[in,sizeis(nItem)A *a])
      

  3.   

    nItem指的是什么呢,是指的a包括了多少个A的结构数吗,但是我希望的是a包括了10个B形的结构B b[10];怎样写呢?
      

  4.   

    sizeis又是什么呢,为什么在MSN中没有相应的说明呢?
      

  5.   

    啊呀,对不起,是size_is,一个确定数祖长度的属性