源声明:int __stdcall fun(unsigned char *srcdata, int *number, unsigned char *tagdata[4]) ;
在C#中应该如何调用传参啊 , 
求教求教~~我目前的代码:               int number = 4;
                byte[,] result = new byte[4, 100];
                IntPtr[] ptArray = new IntPtr[4];
                ptArray[0] = Marshal.AllocHGlobal(100);
                ptArray[1] = Marshal.AllocHGlobal(100);
                ptArray[2] = Marshal.AllocHGlobal(100);
                ptArray[3] = Marshal.AllocHGlobal(100);
                fucn(buf, ref number, ptArray); // 调用
                for (int i = 0; i < number; i++)
                {
                    for (int j = 0; j < 100; j++)
                    {
                        byte b = 0;
                        b = (byte)Marshal.PtrToStructure((IntPtr)((UInt32)ptArray[i] + j), b.GetType());
                        result[i, j] = b;
                    }
                }
                Console.WriteLine();
                Marshal.FreeHGlobal(ptArray[0]);
                Marshal.FreeHGlobal(ptArray[1]);
                Marshal.FreeHGlobal(ptArray[2]);
                Marshal.FreeHGlobal(ptArray[3]);
但是数据不对啊 , 我猜想我的代码写错了, 网上苦寻很久  仍未找到方法 , 求教各位啦 ..

解决方案 »

  1.   

    unsigned char *srcdata 用 stringbuilder
    int *number 这个要用到unsafe的int *
    unsigned char *tagdata[4]用stringbuilder[]看看。
      

  2.   

    菜鸟路过~  感觉你整个ref的结构出错吧?就是ref显式的传递到方法~~~我也不知道怎么说  呵呵fucn(buf, ref number, ptArray); // 调用  这里能直接就传递number, ptArray的参数?  我也不太懂,初学~~~~~~  呵呵   
     看楼下怎么说。学习学习
      

  3.   

    int __stdcall fun(unsigned char *srcdata, int *number, unsigned char *tagdata[4]) 
    这里要求传的数据都是byte的数据啊 ,  stringbuilder[] 能再转成byte的吗 ?
      

  4.   

    int __stdcall fun(unsigned char *srcdata, int *number, unsigned char *tagdata[4]) 
    我估计 srcdata是传入的字节数组,   处理后会从tagdata返回一个二维数组样子(unsigned char *tagdata[4] 猜想这个应该是二维数组)
    如果用StringBuilder, 需要构造一个对应的长度啊 , 如何做到啊 ? 我用Append(new char[100])让他有100个长度 , 但是还是不行呢 , 
      

  5.   

    哪里需要这么复杂、遇到指针的我都是直接IntPtr
    目前没遇到错误
      

  6.   

    你可以F12进去看看IntPtr、
    里面包含了很多的了
    编译器神马的很强大
      

  7.   

    那我现在是一个指针的数组 ,  是不是就要定义成 IntPtr[] tagdata 这样的类型吗 ?
      

  8.   

    int __stdcall fun(unsigned char *srcdata, int *number, unsigned char *tagdata[4]) ;在c#导入中可以定义成 int fun(ref byte abc,ref int edf, ref byte  tagdata)
    在c#中可以这样调用.
    先定义变量。
    byte a;
    int b;
    byte[] c=new byte[4];
    int d;
    然后给他们赋值。…………最后,可以在c#中可以这样调用d= fun(ref a,ref b, ref c[0]);就可以了
      

  9.   

    版主说的就是正确的方向了;一般short和short*的区别在于:DLL要将short*定义的参数赋值后再返回;
    char * 一般可以使用string来传入;如果这个参数还要赋值后返回的话就用StringBuilder.
    具体C++和C#类型的转换可以Google查下C++定义
    //获取RFID卡数据
    EXPORT short __stdcall RFID_ReadData(char * ,short,short,short *,char *);
    C#调用
    [DllImport("Schmidt_RFID_2030")]
    private static extern short TC_RFID_ReadData(ref string sPassword, short iStartAddr, int iDataLen, ref int iCount, StringBuilder sTagData);
      

  10.   

    中间C#可以使用int来调用C++的short,换成Delphi就不行了;应该是.net下的都应该可以;