C#调用c++ 返回值参数类型问题

xysds 2016-02-01 01:11:14
如题,一个第三方的dll,想自己直接调用这个dll,用Blade API Monitor 跟踪得到了参数的传值,以及参数个数。

用C#声明这个函数,然后调用它

声明
[DllImport("dll.dll")]
public static extern int callAPI(int id, byte[] indata, out byte[] outdata, int mode, int sn);


按钮事件调用它
byte[] insec =Encoding.Default.GetBytes("0000000002001019");
byte[] outsec ;
int result = dascard.CallDll.LockCard(icdev, insec,out outsec, 0,Convert.ToInt32(textBoxjmno.Text));

这个函数,主要是参数2和3 :参数1、2、4、5传递进去后,经过计算。然后将结果通过参数3返回来。

可目前难倒的问题就是,参数3 实在不知道用什么类型了。

下面这2张图是我跟踪结果,
发现我自己编写调用函数后,参数3返回的数据有点跟正常调用的不用。尾巴不应该出现额外的东西。(设定的参数类型不同,后面的尾巴也不同。)





我新手,刚接触 C# 。请教下,我该如何正常调用它呢。这个参数3纠结我好几天了。
在线等

...全文
268 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
其实无外乎两种,要么在C#中(调用方)初始化,传入指针 这种,参数直接声明为 [MarshalAs(UnmanagedType.ByValArray, SizeConst= 16)] byte[] outsec, 调用前先byte[] outsec = new byte[16] ; 要么是由对方初始化,返回指针,可以直接声明为out IntPtr outsec 然后 byte[] data = new byte[16]; Marshal.Copy(outsec, data, 0, 16); data就是你想要的
xysds 2016-02-01
  • 打赏
  • 举报
回复
引用 4 楼 shingoscar 的回复:
byte[]已经是指针了,这个out是什么道理?
非常感谢,上面说过。c# 新手。平时调用有返回数据的参数得声明。习惯了。果然取出out 结果就直接成功了。再次感谢。
xysds 2016-02-01
  • 打赏
  • 举报
回复
引用 5 楼 dongxinxi 的回复:
函数原型或者C++里的调用函数贴出来
都说了是第三方的一个dll。
  • 打赏
  • 举报
回复
函数原型或者C++里的调用函数贴出来
Poopaye 2016-02-01
  • 打赏
  • 举报
回复
byte[]已经是指针了,这个out是什么道理?
qbilbo 2016-02-01
  • 打赏
  • 举报
回复
StringBuilder和Intptr呢?
xysds 2016-02-01
  • 打赏
  • 举报
回复
引用 1 楼 qbilbo 的回复:
byte[] outsec = new byte[1024]; 给个初始长度呢?
这个参数的最大长度是16 ,我也试过。 1024 也试过。 上面描述写错了,无论是否弄他的大小,都这样报错。 可他就奇怪了,如果用一个 byte 他就能正常,只不过得到的只能1个字节! 其他信息: 运行时遇到了错误。此错误的地址为 0x7401c3fb,在线程 0x4544 上。错误代码为 0xc0000005。此错误可能是 CLR 中的 bug,或者是用户代码的不安全部分或不可验证部分中的 bug。此 bug 的常见来源包括用户对 COM-interop 或 PInvoke 的封送处理错误,这些错误可能会损坏堆栈。
qbilbo 2016-02-01
  • 打赏
  • 举报
回复
byte[] outsec = new byte[1024]; 给个初始长度呢?

110,538

社区成员

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

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

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