C#调用C的动态链接库

hanyu0528 2009-12-22 03:28:53
最近在做一个项目,有用到明华的读卡器,要用明华读卡器来读卡~!
先初始化设备
调用rf_init 返回值是0,表示成功的!
之后寻卡
rf_Card()一直都是失败,返回值不是0

我调用过程是这样的
动态链接库中的函数原型是:
int rf_card(int icdev,unsigned char _Mode,unsigned long *_Snr);
参 数:icdev:通讯设备标识符
_Mode:寻卡模式mode_card
_Snr:返回的卡序列号



我用C#调用改写成下面形式
[DllImport("mwrf32.dll")]
public static extern int rf_card(int icdev, byte _Mode, ref uint _Snr);

但调用之后返回值一直不是0,说明寻卡不成功,请问我这个改写有什么不对的吗?是不是哪里类型搞错了!!!
...全文
414 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Coder-Java 2010-06-27
  • 打赏
  • 举报
回复
LZ 你的那个读卡器程序做好没有???
zhibingfeng1 2010-03-08
  • 打赏
  • 举报
回复
引用楼主 hanyu0528 的回复:
最近在做一个项目,有用到明华的读卡器,要用明华读卡器来读卡~!
先初始化设备
调用rf_init 返回值是0,表示成功的!
之后寻卡
rf_Card()一直都是失败,返回值不是0

我调用过程是这样的
动态链接库中的函数原型是:
int rf_card(int icdev,unsigned char _Mode,unsigned long *_Snr);
参 数:icdev:通讯设备标识符
      _Mode:寻卡模式mode_card
      _Snr:返回的卡序列号


我用C#调用改写成下面形式
[DllImport("mwrf32.dll")]
public static extern int rf_card(int icdev, byte _Mode, ref uint _Snr);

但调用之后返回值一直不是0,说明寻卡不成功,请问我这个改写有什么不对的吗?是不是哪里类型搞错了!!!
大哥 你怎么改的 改成啥样了 你要贴出来啊 刚好我也遇到类似的问题
zhibingfeng1 2010-03-08
  • 打赏
  • 举报
回复
大哥 你怎么改的 改成啥样了 你要贴出来啊
hanyu0528 2009-12-23
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 vpjian 的回复:]
不是有DEMO吗?
C# code
[DllImport("mwpd_32.dll", EntryPoint="rf_card", SetLastError=true,
CharSet= CharSet.Auto, ExactSpelling=false,
CallingConvention= CallingConvention.StdCall)]//说明: 向指定地址写数据//调用: icdev: 通讯设备标识符 mode: 寻卡模式// _Snr: 返回序列号 _Snrlen: 序列号长度//返回: <0 错误 =0 正确publicstaticextern Int16 rf_card(int icdev, Int16 mode, [MarshalAs(UnmanagedType.LPArray)]byte[] _Snr, [MarshalAs(UnmanagedType.LPArray)]byte[] _Snrlen);
[/Quote]
谢谢你,我的动态链接库跟你不一样,不过我按的方式改了一下,的确可以了,不知道是哪个地方的问题呢。。还没仔细研究下。。。。感谢~!!!结贴给分
vpjian 2009-12-22
  • 打赏
  • 举报
回复
你和厂家联系和他们要DEMO就行了。
vpjian 2009-12-22
  • 打赏
  • 举报
回复
不是有DEMO吗?

[DllImport("mwpd_32.dll", EntryPoint = "rf_card", SetLastError = true,
CharSet = CharSet.Auto, ExactSpelling = false,
CallingConvention = CallingConvention.StdCall)]
//说明: 向指定地址写数据
//调用: icdev: 通讯设备标识符 mode: 寻卡模式
// _Snr: 返回序列号 _Snrlen: 序列号长度
//返回: <0 错误 =0 正确
public static extern Int16 rf_card(int icdev, Int16 mode, [MarshalAs(UnmanagedType.LPArray)]byte[] _Snr, [MarshalAs(UnmanagedType.LPArray)]byte[] _Snrlen);
hanyu0528 2009-12-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 hanyu0528 的回复:]
引用 7 楼 qqiuzaihui 的回复:
引用 5 楼 hanyu0528 的回复:
引用 3 楼 qqiuzaihui 的回复:
  [DllImport("mwrf32.dll")]
  public static extern int rf_card(int icdev, byte _Mode, out uint _Snr);
  试试.
  这样试了,也是不行的

我觉得这应该可以的呀, 不知道你Dll动态库格式会不会有问题.  最近我也在弄这个, 如果你不介意的话, 把动态库及相关的文件发到qiuzaihui@163.com, 我可以帮你测下.

好的,那麻烦你了!
[/Quote]
文件给你发过去了,麻烦你帮我看看~!!万分感谢
hanyu0528 2009-12-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 qqiuzaihui 的回复:]
引用 5 楼 hanyu0528 的回复:
引用 3 楼 qqiuzaihui 的回复:
[DllImport("mwrf32.dll")]
  public static extern int rf_card(int icdev, byte _Mode, out uint _Snr);
  试试.
这样试了,也是不行的

我觉得这应该可以的呀, 不知道你Dll动态库格式会不会有问题.  最近我也在弄这个, 如果你不介意的话, 把动态库及相关的文件发到qiuzaihui@163.com, 我可以帮你测下.
[/Quote]
好的,那麻烦你了!
qqiuzaihui 2009-12-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hanyu0528 的回复:]
引用 3 楼 qqiuzaihui 的回复:
[DllImport("mwrf32.dll")]
public static extern int rf_card(int icdev, byte _Mode, out uint _Snr);
试试.
这样试了,也是不行的
[/Quote]
我觉得这应该可以的呀, 不知道你Dll动态库格式会不会有问题. 最近我也在弄这个, 如果你不介意的话, 把动态库及相关的文件发到qiuzaihui@163.com, 我可以帮你测下.
hanyu0528 2009-12-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zyouhua83 的回复:]
像这样的方式你最好用非安全代码的方式,我以前做过,的确会出现这种问题
[/Quote]
我加了unsafe,把编译模式设置成允许不安全代码
但还是不行的。。。
hanyu0528 2009-12-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 qqiuzaihui 的回复:]
[DllImport("mwrf32.dll")]
public static extern int rf_card(int icdev, byte _Mode, out uint _Snr);
试试.

[/Quote]
这样试了,也是不行的
hanyu0528 2009-12-22
  • 打赏
  • 举报
回复
int===> IntPtr
我第一个参数用IntPtr试过了,也不行~!!
[DllImport("mwrf32.dll")]
public static extern int rf_card(IntPrt icdev, byte _Mode, ref uint _Snr);
qqiuzaihui 2009-12-22
  • 打赏
  • 举报
回复
[DllImport("mwrf32.dll")]
public static extern int rf_card(int icdev, byte _Mode, out uint _Snr);
试试.
zyouhua83 2009-12-22
  • 打赏
  • 举报
回复
像这样的方式你最好用非安全代码的方式,我以前做过,的确会出现这种问题
Lovely_baby 2009-12-22
  • 打赏
  • 举报
回复
如果参数是传进的话,用string是可以的,如果是传出的话,用StringBuilder。
至于const int*,用"ref int"来替换。


int===> IntPtr
是不是类型错误了??

110,567

社区成员

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

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

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