日期:2014-05-17  浏览次数:21080 次

C#中怎么将int数组传递给ref int型参数
C#调用VC写的OCX

VC的OCX中的一个函数的参数为指针类型,C#将其对应为了ref int
在C#中应该怎么传递数组给这个ref int型参数呢?

————————————————————————————————————
C#? OCX ref?int

------解决方案--------------------
用int[]
------解决方案--------------------

             IntPtr[] ptArray = new IntPtr[1];
            ptArray[0] = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(int)) * 65535);
            IntPtr pt = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(IntPtr)) * 1);
            Marshal.Copy(ptArray, 0, pt, 1);
            
            callmethod(ref pt);

            for (int i = 0; i < 65535; i++) 
            { 
                int n = (int)Marshal.PtrToStructure((IntPtr)((UInt32)ptArray[0] + i * sizeof(int)), typeof(int)); 
            } 
            Marshal.FreeHGlobal(ptArray[0]); 
            Marshal.FreeHGlobal(pt); 


------解决方案--------------------
int[] a = new int[6];
传递ref a[0]即可。
------解决方案--------------------
你说的结构数组是什么东西?
------解决方案--------------------
byte[]
------解决方案--------------------
你的RECT长度是多少?先确定下那个结构体的总长度,如果RECT的长度也是1个字节,那么这个结构体就是4字节的了,那就相当于一个Int32类型的长度了,之后的简单了,直接创建Int32的数组,进行数据拷贝。
------解决方案--------------------
你先输出下那个Marshal.SizeOf(typeof(THREGION))的结果,倒底是多少?(后续数据处理应该要用到。)
而你的错误是因为传递了错误的长度,那个nMaxRegionCount是结构体数组的长度,而不是buff数组的长度,这里必须传递buff数组的长度的长度,否则在写入该数组时就可能写到数组外面去了,最后那个那个nRealRegionCount则是返回你实际用到的长度。

------解决方案--------------------
你看看这个函数的定义是在哪里,能不能修改,因为一般接口函数不是用IntPtr传递,就是用ref byte,ref int非常不适合数据类型的转换。
另外你想办法测试下C++里面封装的结构体大小,你这里是20,C++里面必须也是20呀。