求教C#调用DLL参数为数组指针如何传参

cdisk 2012-12-21 11:37:55
源声明:

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]);


但是数据不对啊 , 我猜想我的代码写错了, 网上苦寻很久 仍未找到方法 , 求教各位啦 ..
...全文
653 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
cdisk 2013-01-11
  • 打赏
  • 举报
回复
最后没办法, 用C++做了个小程序来调 哎.....
华生天下行走 2012-12-25
  • 打赏
  • 举报
回复
中间C#可以使用int来调用C++的short,换成Delphi就不行了;应该是.net下的都应该可以;
华生天下行走 2012-12-25
  • 打赏
  • 举报
回复
版主说的就是正确的方向了; 一般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);
threenewbee 2012-12-21
  • 打赏
  • 举报
回复
unsigned char *srcdata 用 stringbuilder int *number 这个要用到unsafe的int * unsigned char *tagdata[4]用stringbuilder[]看看。
cdisk 2012-12-21
  • 打赏
  • 举报
回复
自己顶一下, 求回复
youyi9 2012-12-21
  • 打赏
  • 举报
回复
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]); 就可以了
cdisk 2012-12-21
  • 打赏
  • 举报
回复
那我现在是一个指针的数组 , 是不是就要定义成 IntPtr[] tagdata 这样的类型吗 ?
  • 打赏
  • 举报
回复
你可以F12进去看看IntPtr、 里面包含了很多的了 编译器神马的很强大
  • 打赏
  • 举报
回复
哪里需要这么复杂、遇到指针的我都是直接IntPtr 目前没遇到错误
cdisk 2012-12-21
  • 打赏
  • 举报
回复
求回复啊
cdisk 2012-12-21
  • 打赏
  • 举报
回复
int __stdcall fun(unsigned char *srcdata, int *number, unsigned char *tagdata[4]) 我估计 srcdata是传入的字节数组, 处理后会从tagdata返回一个二维数组样子(unsigned char *tagdata[4] 猜想这个应该是二维数组) 如果用StringBuilder, 需要构造一个对应的长度啊 , 如何做到啊 ? 我用Append(new char[100])让他有100个长度 , 但是还是不行呢 ,
cdisk 2012-12-21
  • 打赏
  • 举报
回复
能否求详解啊 . 小弟对C#不是很熟悉 .
东邪独孤 2012-12-21
  • 打赏
  • 举报
回复
String或者StringBuilder都可以。
cdisk 2012-12-21
  • 打赏
  • 举报
回复
int __stdcall fun(unsigned char *srcdata, int *number, unsigned char *tagdata[4]) 这里要求传的数据都是byte的数据啊 , stringbuilder[] 能再转成byte的吗 ?
cs张 2012-12-21
  • 打赏
  • 举报
回复
菜鸟路过~ 感觉你整个ref的结构出错吧?就是ref显式的传递到方法~~~我也不知道怎么说 呵呵 fucn(buf, ref number, ptArray); // 调用 这里能直接就传递number, ptArray的参数? 我也不太懂,初学~~~~~~ 呵呵 看楼下怎么说。学习学习

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧