求教C#调用DLL参数为数组指针如何传参
源声明:
int __stdcall fun(unsigned char *srcdata, int *number, unsigned char *tagdata[4]) ;
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]);
[解决办法]
菜鸟路过~ 感觉你整个ref的结构出错吧?就是ref显式的传递到方法~~~我也不知道怎么说 呵呵
fucn(buf, ref number, ptArray); // 调用 这里能直接就传递number, ptArray的参数? 我也不太懂,初学~~~~~~ 呵呵
看楼下怎么说。学习学习
[解决办法]
String或者StringBuilder都可以。
[解决办法]
哪里需要这么复杂、遇到指针的我都是直接IntPtr
目前没遇到错误
[解决办法]
你可以F12进去看看IntPtr、
里面包含了很多的了
编译器神马的很强大
[解决办法]
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]);
就可以了
[解决办法]
版主说的就是正确的方向了;
一般short和short*的区别在于:DLL要将short*定义的参数赋值后再返回;
char * 一般可以使用string来传入;如果这个参数还要赋值后返回的话就用StringBuilder.
具体C++和C#类型的转换可以Google查下
C++定义
//获取RFID卡数据
EXPORT short __stdcall RFID_ReadData(char * ,short,short,short *,char *);
[DllImport("Schmidt_RFID_2030")]
private static extern short TC_RFID_ReadData(ref string sPassword, short iStartAddr, int iDataLen, ref int iCount, StringBuilder sTagData);