首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

求教C#调用DLL参数为数组指针怎么传参

2013-01-23 
求教C#调用DLL参数为数组指针如何传参源声明:int __stdcall fun(unsigned char *srcdata, int *number, un

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


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


但是数据不对啊 , 我猜想我的代码写错了, 网上苦寻很久  仍未找到方法 , 求教各位啦 ..
[解决办法]
unsigned char *srcdata 用 stringbuilder
int *number 这个要用到unsafe的int *
unsigned char *tagdata[4]用stringbuilder[]看看。


[解决办法]
菜鸟路过~  感觉你整个ref的结构出错吧?就是ref显式的传递到方法~~~我也不知道怎么说  呵呵

fucn(buf, ref number, ptArray); // 调用  这里能直接就传递number, ptArray的参数?  我也不太懂,初学~~~~~~  呵呵   
 看楼下怎么说。学习学习求教C#调用DLL参数为数组指针怎么传参
[解决办法]
String或者StringBuilder都可以。
[解决办法]
哪里需要这么复杂、遇到指针的我都是直接IntPtr
目前没遇到错误
求教C#调用DLL参数为数组指针怎么传参
[解决办法]
你可以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 *);

C#调用
[DllImport("Schmidt_RFID_2030")]
private static extern short TC_RFID_ReadData(ref string sPassword, short iStartAddr, int iDataLen, ref int iCount, StringBuilder sTagData);

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

热点排行