请问一下。
我用vc写了一个ocx控件。
里头包含了一个函数long Test(long* pbuffer,long*len){...}
让使用者在外部分配一个足够的内存传递进来,在vc中可以很好调用,但是在C#中这个该如何调用,
C#中是该函数是int Test(ref int pbuffer, ref int len){..}
c#中如果定义一个pbuffer传递进去?
以前一直是使用Intper类型传递,但是现在申明intper后,Test(ref (int)pbuffer,ref len)强制转换也不行。
麻烦大家帮忙下。谢谢

解决方案 »

  1.   

    int Test(ref int pbuffer, ref int len)这个声明是自动生成的?你看能不能改成int Test(int[] pbuffer, ref int len)
    如果不能改,就用fixed方法取得数组的指针,再将指针用IntPtr.ToInt32 方法 转成整数,传递进去。
      

  2.   

    to soaringbird:
    你好,Test(ref int pbuffer, ref int len)是自动生成的,好象不能改成int[] pbuffer,
    能否有实际的例子提供参考一下。谢谢
      

  3.   

    to soaringbird: 
    在C# 中,我是这样调用。
    int len=100;
    IntPtr pPtr;
    pPtr= Marshal.AllocCoTaskMem(len);//分配足够大的内存
    int buffer = pp.ToInt32();
    this.MyOcx.Test(ref buffer, ref len);//这步执行出错,这个Test的函数声明是
    Test(ref int buffer, ref len).所以要传递int,我有想过传递IntPtr,但是不知道如何强制转换在传递进去,好象是不能用到int[] buffer,
    还有没有别的方法吗?
      

  4.   

    byte[] b = new byte[100];  //分配足够大的内存 
     fixed (byte* pb = b)
      {
        IntPtr ptr = (IntPtr)pb;
    int buffer = ptr.ToInt32();
    this.MyOcx.Test(ref buffer, ref len)看看这样行不行
      

  5.   

    to soaringbird:
    谢谢你的代码,
    但是运行后还是有错误。。
    提示:
    An invalid VARIANT was detected during a conversion from an unmanaged VARIANT to a managed object. Passing invalid VARIANTs to the CLR can cause unexpected exceptions, corruption or data loss.
    那个ocx的函数。在vc中就是返回了一个内存的buffer,感觉要用Marshal这类的东西,但是一直调用也是出错。。
      

  6.   

    接口传递问题:
    你的vc OCX 改用 long Test( byte *pbuffer , long *len ){...}  试试
      

  7.   

    我也有类似的问题,一直没有解决,第三方的vc ocx定义func(short *addr),addr指向一个结构体,C#调用此ocx,包装出来成func(ref short addr),C#层不知道如何才能把那个结构体传下去。