[转]使用C#调用金诚信71x系列读卡器的DLL
原文如下:
由于项目需要,我必须使用C#来操作读卡器,读卡器只提供了几个可供调用的DLL文件,并没呀给出例程之类的资源,虽然我认为这个读卡器厂商非常失败,但是我也只能耐着性子做完这件事情。
我们在使用C++的时候,对动态链接库的操作是非常方便的,只要使用LoadLibrary()就可以很简单的调用该DLL文件中所包含的函数。但是使用.NET 2.0就不那么容易了,由于本人使用C#,所以以C#代码为例与大家共享如何在.NET平台下对DLL文件进行调用。
1.使用DLL函数查看器对读卡器厂商提供的DLL文件进行了分析。找出了函数名,和DLL的依赖关系。DLL的依赖关系非常重要,我们必须找到ghc715.dll依赖的DLL文件,并且在加载动态链接库的时候必须先将依赖的DLL加载到系统中,才能保证我们对读卡器可以进行操作。
2.using System.Runtime.InteropServices;该命名空间提供各种各样支持 COM interop 及平台调用服务的成员。主要是用于与非托管代码之间的交互。该命名空间中=最重要的属性有 DllImportAttribute(可以用来定义用于访问非托管 API 的平台调用方法)和 MarshalAsAttribute(可以用来指定如何在托管内存与非托管内存之间封送数据)。 详见http://msdn2.microsoft.com/zh-cn/library/system.runtime.interopservices(VS.80).aspx
3.由于读卡器提供的DLL文件无法在系统内注册,所以我们只能采用动态加载的方法来完成这一工作。使用了如下几个Windows 的 API:
1. Loadlibrary: 装载指定DLL动态库
2. GetProcAddress:获得函数的入口地址
3. Freelibrary: 从内存中卸载动态库
为了完成调用GetProcAddress返回的函数地址,我们使用了Marshal.GetDelegateForFunctionPointer方法,该方法将非托管函数的指针转换为委托。
看到这些知识,剩下的事情就简单了,我把所有对读卡器的操作封装成了一个类,提供两个public 函数,一个是Read(读卡)另外一个就是Write(写卡)。并把类的主要结构写到下面,仅供参考,希望有高人给出一些指点意见。
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace QL.Card
{
public class Card
{
#region Win API 声明调用kernel.dll中的三个方法
[DllImport("kernel32.dll")]
private extern static IntPtr LoadLibrary(string path);
[DllImport("kernel32.dll")]
private extern static IntPtr GetProcAddress(IntPtr lib, string funcName);
[DllImport("kernel32.dll")]
private extern static bool FreeLibrary(IntPtr lib);
[DllImport("kernel32.dll")]
public static extern IntPtr GetStdHandle(int nStdHandle);
const int STD_OUTPUT_HANDLE = -11;
#endregion
private IntPtr hLib;
private IntPtr otherlib1;
private IntPtr otherlib2;
public (String DLLPath)
{
otherlib1 = LoadLibrary("MFC42D.dll");
otherlib2 = LoadLibrary("MSVCRTD.dll");
hLib = LoadLibrary(DLLPath); }
~DllInvoke()
{
FreeLibrary(hLib);
FreeLibrary(otherlib2);
FreeLibrary(otherlib1);
}
//将要执行的函数转换为委托
public Delegate Invoke (string APIName,Type t)
{
IntPtr api = GetProcAddress(hLib, APIName);
return (Delegate)Marshal.GetDelegateForFunctionPointer(api, t);
}
//这里将DLL里要调用的函数声明为委托,其中int为该函数的返回值
public delegate int readcard(//参数列表);
public delegate int writecard(//参数列表);
public string Read()
{
Carder dll = new Carder(Environment.CurrentDirectory + "\\ghc715.dll");
string mdata1 = "";
string mdata2 = "";
string error = "";
readcard rc = (readcard)dll.Invoke("readcard", typeof(readcard));
int rcCode = rc(1, 2, out mdata1, out mdata2, 2);
//接下来是一些错误处理
}
public string Write(string input)
{
Carder dll = new Carder(Environment.CurrentDirectory + "ghc715.dll");
string mdata1 = input;
string mdata2 = "";
string error = "";
writecard rc = (writecard)dll.Invoke("writecard", typeof(writecard));
int rcCode = rc(1, 2, mdata1,mdata2, 2);
//错误处理
}
}
}
就这么多了,希望大家多多指教!
[转]使用C#调用金诚信71x系列读卡器的DLL相关推荐
- 坚石诚信ET系列加密锁应用保护技巧
众所周知,利用加密锁保护软件不被破解及添加相应的授权,是众多软件开发商不二的选择,有一些软件开发商反应用加密锁保护的软件被复制.破解等等.那么加密锁被复制了真的是这样吗?软件被破解了到底是为什么?加密 ...
- 用mathematica调用JPL的DE系列星历表 · DE405
[写在前面的话] 本人是师大天文系的学生,这学期课业要求学习DE系列星历表的使用,老师没有细讲具体方法,所以个人摸索了大概两个礼拜,也算是勉强实现了目标.写这篇文章的目的是为了给同样小白的朋友一点引导 ...
- 开发ActiveX控件调用另一个ActiveX系列0——身份证识别仪驱动的问题
程序员要从0下表开始,这篇是介绍这个系列的背景的,没有兴趣的人可以直接跳过. 为什么要开发ActiveX控件 由于工作需要,我们开发了一个网站,使用了一款身份证识别仪的网页ActiveX(OCX)插件 ...
- java openoffice 打印_java调用openoffice将office系列文档转换为PDF的示例方法
前导: 发过程中经常会使用java将office系列文档转换为PDF, 一般都使用微软提供的openoffice+jodconverter 实现转换文档. openoffice既有windows版本也 ...
- android jni 调用java_Android JNI开发系列(九)JNI调用Java的静态方法实例方法
JNI调用Java的静态方法&实例方法 package org.professor.jni.bean; import android.util.Log; /** * Created by pe ...
- axios某一接口失败后不调用_axios 源码系列之如何取消请求
我们在前后端交互的过程中,通常是通过请求接口来实现的,而一个页面中的交互又非常复杂,例如需要多次频繁请求同一个接口,或者在接口还没返回时就要切换路由等.这些都需要对接口请求的时机或者请求接口之后进行处 ...
- win10 python 调用模块_python常识系列14--gt;python通过jpype模块调用jar包
前言 能坚持一件事,本身就是一种很了不起的才华. 一.jpype模块是什么? 能够让 python 代码方便地调用 Java 代码的工具 二.jpype模块安装 安装和其它模块没区别,但是注意模块名 ...
- python文件之间的相互调用_「Python 系列」 Python 生成器函数详解
Python的生成器函数提供了一种强大的机制来管理数据和计算资源,但是对于Python的新手来说,它们不一定直观.在本文中,我将分解生成器的机制,同时还介绍我希望是一个有启发性的示例:用于管理和流传输 ...
- 啊金学习javascript系列一之javascript整体印象
javascript是一门编程语言,这个是第一个观点.是编程语言,那就拥有编程语言的功能.在我理解之中,编程语言是和计算机打交道的语言,就是我们跟计算机说话用的语言,是用来指挥计算机的.人类能够理解语 ...
最新文章
- Console-算法-冒泡排序法|倒水法
- 编写安全的ASP代码
- WPF实现Windows资源管理器(附源码)
- mysql 为游标赋值_mysql 存储过程之游标
- php 串行化数据,PHP中的串行化变量和序列化对象
- 高通说要抢占AI生态入口,投资商汤摩拜,明年推NPU芯片
- java实现邮件发送, 抄送及多附件发送
- java 人脸识别 性别识别
- Vue.js身份证读卡器阅读器谷歌chrome火狐Firefox网页实现读取方法
- 第2次作业——时事点评
- HackingLab 脚本关
- 游戏云服务器应该怎么选
- c语言五子棋人工智能算法,五子棋人工智能算法实现研究,优化五子棋智能算法的思路...
- html文本怎么打印出来,如何把一个html文件直接打印出来(200分)
- 日野汽车数据作假召开记者招待会
- 创建证书与Xcode破解
- WPF--Dispatcher.BeginInvoke()方法使用不当导致UI界面卡死的原因分析
- 实例分割研究综述总结
- miui7+android系统版本,用户升级完MIUI 7之后发现居然是Android 4.4,然后就疯了
- 802协议族太网帧格式