请教c#调dll,参数是BYTE**,怎么处理?

codeyell-com 2017-12-19 11:27:27
dll里,函数声明是这样的:

GetList(
HANDLE lLoginHandle,
DWORD dwInfoContol,
BYTE** pBuf,
LONG& lBufSize)


其中,第二个参数,传入不同的值,表示第三个参数代表的结构体是哪一个,然后要用对应的结构体来解析里面的数据。第四个参数是返回数据的大小。

C#这样写:


public static extern int GetList(int lLoginHandle, UInt32 dwType, out IntPtr hWnd, out int lSize);

var lSize = 0;
IntPtr pData = IntPtr.Zero;
var status = GetList(loginHandle, 2, out pData, out lSize);

CAMERA[] list = new CAMERA[lSize];
MarshalUnmananagedArray2Struct<CAMERA>(pData, lSize, out list);


MarshalUnmananagedArray2Struct定义如下:


public static void MarshalUnmananagedArray2Struct<T>(IntPtr unmanagedArray, int length, out T[] mangagedArray)
{
var size = Marshal.SizeOf(typeof(T));
mangagedArray = new T[length];

for (int i = 0; i < length; i++)
{
IntPtr ins = new IntPtr(unmanagedArray.ToInt64() + i * size);
mangagedArray[i] = Marshal.PtrToStructure<T>(ins);
}
}


结果dll内部报错说接收数据异常,请问该如何处理?谢谢大神了。
...全文
343 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
threenewbee 2017-12-20
  • 打赏
  • 举报
回复
相当于byte[,] 也可以直接用unsafe后用指针。
秋的红果实 2017-12-20
  • 打赏
  • 举报
回复
IntPtr pData = IntPtr.Zero;  ==> byte pData=0;

110,476

社区成员

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

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

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