求救,C++的dll,这个方法用C#调用参数怎么定义?

St_Jar 2012-02-07 03:39:00
int __stdcall M100_ReadMagcardDecode(HANDLE ComHandle, BYTE _track, DWORD *_DataLen,BYTE _BlockData[]);
...全文
128 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
St_Jar 2012-02-07
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 shenyc 的回复:]
如果你要改变数组的值必须使用地址传递
[/Quote]

谢谢,已经好了,public static extern int M100_ReadMagcardDecode(IntPtr handle, byte _track, ref UInt32 _DataLen, [MarshalAs(UnmanagedType.LPArray)] byte[] blockData);

之前报错是在调用的时候没有给byte[] 声明长度;还是要感谢你的帮忙
shenyc 2012-02-07
  • 打赏
  • 举报
回复
如果你要改变数组的值必须使用地址传递
shenyc 2012-02-07
  • 打赏
  • 举报
回复
对于C来说 参数 BYTE _BlockData[] 和 BYTE* _BlockData 是一样的,既然 DWORD * 用 ref UInt,那么BYTE _BlockData[] 相应可以使用 ref Byte[] _BlockData

用下面的试试
public static extern IntPtr M100_ReadMagcardDecode(IntPtr ComHandle, Byte _track, ref UInt _DataLen, ref Byte[] _BlockData);
sxfgen 2012-02-07
  • 打赏
  • 举报
回复

在web 里这么写 这是以前写过的 也是网上找的,可以实现,lz在自己查查吧。
class DllDynamic:IDisposable//这个类是固定的
{
[DllImport("Kernel32.dll")]
public static extern int LoadLibrary(string lpFileName);

[DllImport("Kernel32.dll")]
public static extern bool FreeLibrary(int hModule);

[DllImport("Kernel32.dll")]
public static extern IntPtr GetProcAddress(int hModule, string lpProcName);

#region IDisposable 成员

public void Dispose()
{
throw new NotImplementedException();
}

#endregion
}

''''''
调用
int hLib = DllDynamic.LoadLibrary(path);//应用dll的路径
IntPtr ptr = DllDynamic.GetProcAddress(hLib, "SS_Open_Tcp");
SS_Open_Tcp opentcp = (SS_Open_Tcp Marshal.GetDelegateForFunctionPointer(ptr, typeof(SS_Open_Tcp));//dll里的方法(SS_Open_Tcp)
int numtcp = opentcp(sIP, port, delay);//打开连接(调用)


St_Jar 2012-02-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 shenyc 的回复:]
可以看一下C++/CLI 的数组封送处理
http://blog.csdn.net/shenyc/article/details/3092170
[/Quote]
发的是C++封装的dll,我是要用C#调用的,C#没有 DWORD这些啊。。 DWORD *我在网上查了下,用ref UInt

BYTE _BlockData[] 不知道怎么调用了。。
shenyc 2012-02-07
  • 打赏
  • 举报
回复
可以看一下C++/CLI 的数组封送处理
http://blog.csdn.net/shenyc/article/details/3092170
shenyc 2012-02-07
  • 打赏
  • 举报
回复
还有 DWORD* _DataLen 为啥不用DWORD_DataLen? 问什么用指针?
shenyc 2012-02-07
  • 打赏
  • 举报
回复
int __stdcall M100_ReadMagcardDecode(HANDLE ComHandle, BYTE _track, DWORD *_DataLen,BYTE _BlockData[]);

改成
int WINAPI M100_ReadMagcardDecode(HANDLE ComHandle, BYTE _track, DWORD *_DataLen,BYTE _BlockData[]);
试试
St_Jar 2012-02-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 shenyc 的回复:]
public static extern IntPtr M100_ReadMagcardDecode(IntPtr ComHandle, Byte _track, IntPtr _DataLen, Byte[] _BlockData);
[/Quote]

Byte[] _BlockData主要就是这个参数,这样不行,在网上查了下,用[MarshalAs(UnmanagedType.LPArray)] Byte[] blockData也不行
St_Jar 2012-02-07
  • 打赏
  • 举报
回复
求救啊,自己顶顶
shenyc 2012-02-07
  • 打赏
  • 举报
回复
public static extern IntPtr M100_ReadMagcardDecode(IntPtr ComHandle, Byte _track, IntPtr _DataLen, Byte[] _BlockData);
stonespace 2012-02-07
  • 打赏
  • 举报
回复
参数大约这样:

public static int M100_ReadMagcardDecode(IntPtr ComHandle, byte _track, uint _DataLen[], byte _BlockData[]);

110,534

社区成员

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

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

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