本文转自:http://blog.csdn.net/cnhyong/archive/2008/01/24/2064167.aspx
原文如下:
  由于项目需要,我必须使用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相关推荐

  1. 坚石诚信ET系列加密锁应用保护技巧

    众所周知,利用加密锁保护软件不被破解及添加相应的授权,是众多软件开发商不二的选择,有一些软件开发商反应用加密锁保护的软件被复制.破解等等.那么加密锁被复制了真的是这样吗?软件被破解了到底是为什么?加密 ...

  2. 用mathematica调用JPL的DE系列星历表 · DE405

    [写在前面的话] 本人是师大天文系的学生,这学期课业要求学习DE系列星历表的使用,老师没有细讲具体方法,所以个人摸索了大概两个礼拜,也算是勉强实现了目标.写这篇文章的目的是为了给同样小白的朋友一点引导 ...

  3. 开发ActiveX控件调用另一个ActiveX系列0——身份证识别仪驱动的问题

    程序员要从0下表开始,这篇是介绍这个系列的背景的,没有兴趣的人可以直接跳过. 为什么要开发ActiveX控件 由于工作需要,我们开发了一个网站,使用了一款身份证识别仪的网页ActiveX(OCX)插件 ...

  4. java openoffice 打印_java调用openoffice将office系列文档转换为PDF的示例方法

    前导: 发过程中经常会使用java将office系列文档转换为PDF, 一般都使用微软提供的openoffice+jodconverter 实现转换文档. openoffice既有windows版本也 ...

  5. android jni 调用java_Android JNI开发系列(九)JNI调用Java的静态方法实例方法

    JNI调用Java的静态方法&实例方法 package org.professor.jni.bean; import android.util.Log; /** * Created by pe ...

  6. axios某一接口失败后不调用_axios 源码系列之如何取消请求

    我们在前后端交互的过程中,通常是通过请求接口来实现的,而一个页面中的交互又非常复杂,例如需要多次频繁请求同一个接口,或者在接口还没返回时就要切换路由等.这些都需要对接口请求的时机或者请求接口之后进行处 ...

  7. win10 python 调用模块_python常识系列14--gt;python通过jpype模块调用jar包

    前言 能坚持一件事,本身就是一种很了不起的才华. 一.jpype模块是什么? 能够让 python 代码方便地调用 Java 代码的工具 二.jpype模块安装 安装和其它模块没区别,但是注意模块名 ...

  8. python文件之间的相互调用_「Python 系列」 Python 生成器函数详解

    Python的生成器函数提供了一种强大的机制来管理数据和计算资源,但是对于Python的新手来说,它们不一定直观.在本文中,我将分解生成器的机制,同时还介绍我希望是一个有启发性的示例:用于管理和流传输 ...

  9. 啊金学习javascript系列一之javascript整体印象

    javascript是一门编程语言,这个是第一个观点.是编程语言,那就拥有编程语言的功能.在我理解之中,编程语言是和计算机打交道的语言,就是我们跟计算机说话用的语言,是用来指挥计算机的.人类能够理解语 ...

最新文章

  1. Console-算法-冒泡排序法|倒水法
  2. 编写安全的ASP代码
  3. WPF实现Windows资源管理器(附源码)
  4. mysql 为游标赋值_mysql 存储过程之游标
  5. php 串行化数据,PHP中的串行化变量和序列化对象
  6. 高通说要抢占AI生态入口,投资商汤摩拜,明年推NPU芯片
  7. java实现邮件发送, 抄送及多附件发送
  8. java 人脸识别 性别识别
  9. Vue.js身份证读卡器阅读器谷歌chrome火狐Firefox网页实现读取方法
  10. 第2次作业——时事点评
  11. HackingLab 脚本关
  12. 游戏云服务器应该怎么选
  13. c语言五子棋人工智能算法,五子棋人工智能算法实现研究,优化五子棋智能算法的思路...
  14. html文本怎么打印出来,如何把一个html文件直接打印出来(200分)
  15. 日野汽车数据作假召开记者招待会
  16. 创建证书与Xcode破解
  17. WPF--Dispatcher.BeginInvoke()方法使用不当导致UI界面卡死的原因分析
  18. 实例分割研究综述总结
  19. miui7+android系统版本,用户升级完MIUI 7之后发现居然是Android 4.4,然后就疯了
  20. 802协议族太网帧格式

热门文章

  1. Java并发编程实战系列10之避免活跃性危险
  2. docker暴露多个端口
  3. 四、垃圾收集之垃圾收集算法
  4. Strict Mode (JavaScript)
  5. 《深入浅出WPF》笔记——事件篇
  6. Hyper-V应用指南之6-差异磁盘的使用[转]
  7. mass Framework在后端的核心模块
  8. 漫谈ERP实施服务的三种境界
  9. 推荐的 PHP 读物列表
  10. HPE第四季度财报数据喜忧参半