在c#中引入com组件时,C#自动将接口函数的结构指针(形式参数)转化成
System.IntPtr类型,却删除了out关键字. 即原来的[out]int* 变成了 out int  --- (这个保留了out关键字,完全没有问题)
[out]int** 变成了 System.IntPtr
                 ---(这个被C#去掉了out关键字,因而无法将数据传出)请问怎样解决这个问题呢?(在不修改原组件的前提下)注 : 组件是用VC6 ATL写的。//====================================
这里给出我作的一个失败的试验:
(VCCOM是组件名,TwoParameter是接口,ReturnArray是TwoParameter的函数方法) VCCOMLib.TwoParameterClass tpc=new VCCOMLib.TwoParameterClass();
 int[] iArray=new int[10];
 fixed(int* pArray=iArray)
 {
   int size;
   System.IntPtr intptr=new System.IntPtr((void*)pii);
   tpc.ReturnArray(10,out size,intptr);
   int* newArray=(int*)intptr.ToPointer();
 }
 这种方法编译和执行都可以通过,
 但是实际上什么值都没有传出来,会发现newArray永远都是值为0的整数数组。另外,强行加out或者ref在System.IntPtr前面也不行,因为编译无法通过。

解决方案 »

  1.   

    你这么传数组本来就不对,应该用SAFEARRAY来传数组。
      

  2.   

    嗯,不知道楼上这位兄弟说的不对指得是COM组件不对,还是我做的试验不对。
    如果是前者,原来的组件就是 int** 的参数,我也没有办法啊还望哪位位兄台给出一个不修改原来的组件而能够传出数据的方法。。
    谢谢了!!BOW
    (如果可以修改COM组件的话,我已经找到解决方法,就是把[out]int** 
    改成[out.retval]int**, 这样的话就能把COM的返回值传出到C#中。)
      

  3.   

    呜哇!!谢谢Analyst的提示,终于找到解决方法乐。
    待会我会另开一个帖子详细说明的。BOW TO ANALYST。