C++动态库导出函数中有指针,如何用C#写导入函数?指针指向图像数据内存~

银霜覆秋枫 2014-10-28 09:12:27
C++原型为:bool CALLBACK Callbackdata(int index, int mode, BYTE* data, int len, int w, int h)
其中data指向图像数据单元;我自己写的C#导入函数声明为委托:
public delegate bool DataCallBack(int index, int type, byte[] pdata, int len, int width, int height);
调用委托:
MfcDllEncapsulater.DataCallBack dataCallback = new MfcDllEncapsulater.DataCallBack(callbackData);
nRet = MfcDllEncapsulater.WP_IPC_SetDataCallBack(dataCallback);

data数组如果正确的话应该是保存有长度为width*height*4的图像数据,然后在刚定义的回调函数中对数据做处理~,但是实际情况是pdata这个数组的大小始终为1;我个人的猜想是当C#以数组形式传入参数时,C++动态库中并没有为data作初始化大小的操作~求大神解答~
...全文
202 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
银霜覆秋枫 2014-10-28
  • 打赏
  • 举报
回复
引用 5 楼 Saleayas 的回复:
修饰在参数的前面,告诉程序, data 是一个数组。 但是 C++ 的数组长度是有单独的参数来说明的。此时需要告诉程序是哪个参数来修饰数组的长度的。 这个修饰就是 SizeParamIndex,表示这个长度在从 0 开始的第三个参数。 C++ 如何修饰的,可以看看 IDL 。 C# 修饰在整个函数的前面,是用来修饰返回值的,而且需要[return:MarshalAs()]。 所以第二个是编译不过的。
明白了 ~谢谢~
Saleayas 2014-10-28
  • 打赏
  • 举报
回复
修饰在参数的前面,告诉程序, data 是一个数组。 但是 C++ 的数组长度是有单独的参数来说明的。此时需要告诉程序是哪个参数来修饰数组的长度的。 这个修饰就是 SizeParamIndex,表示这个长度在从 0 开始的第三个参数。 C++ 如何修饰的,可以看看 IDL 。 C# 修饰在整个函数的前面,是用来修饰返回值的,而且需要[return:MarshalAs()]。 所以第二个是编译不过的。
银霜覆秋枫 2014-10-28
  • 打赏
  • 举报
回复
引用 3 楼 Saleayas 的回复:
byte[] pdata 修改为 [MarshalAs(UnmanagedType.LPArray, SizeParamIndex=3)] byte[] pdata
这样:public delegate bool DataCallBack(int index, int type, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 3)] byte[] data, int len, int width, int height); 还是这样: [MarshalAs(UnmanagedType.LPArray, SizeParamIndex=3)] public delegate bool DataCallBack(int index, int type, byte[] data, int len, int width, int height);?能讲下原因不?
Saleayas 2014-10-28
  • 打赏
  • 举报
回复
byte[] pdata 修改为 [MarshalAs(UnmanagedType.LPArray, SizeParamIndex=3)] byte[] pdata

110,538

社区成员

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

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

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