问题描述:
想问一下牛人,用c#怎么调用自己编写的mfc的dll,关键是dllImport()后面的接口函数怎么写,也就是mfc的入口是甚么?谢谢。
解析:
在使用外部的非.NET托管的DLL的时候,通常你要知道这个dll中公开了那些接口(一般情况下只有公开的方法有用)。
例如:在一个用C语言编写的用来读取串口上IC卡读卡器的dll中公开了如下的方冲型法。
int auto_init(int port,ulong baud)
这个方法是用来自动初始话读卡器的。我们在C#中就要通过dllImport的方式来使用这个接口散哪猜。首先程序集要引用using System.Runtime.InteropServices命名空间。然后在我们的程序中声明要引用的这个方法。
[DllImport("Mwic_32.dll")]
public static unsafe extern int ic_init(int port,ulong baud)
特殊属性DllImport的构造函数中输入的是所引用的dll的中文名称或者全名称,如果输入的只是文件名那么系缓兆统会在运行目录下寻找文件名为指定名称的程序集。注意声明的引用必须是static unsafe extern 类型的。其他的形式就跟dll中定义的一样。这样声明之后,我们就可以在自己的代码里面就像调用方法一样的使用这个方法了。
在使用的时候,因为我们调用的是一段非托管代码,因此就必须在非托管方法中使用,声明非托管方法的形式如下。
/ <summary>
/ 初始化RD系列通用读卡器的方法。(本方法调用非托管代码)
/ </summary>
public unsafe void initMachine()
{
this.opened=true
this.st=this.icdev=ic_init(this.port,9600)
if(this.st<0)
{
this.error(this.st)
this.opened=false
return
}
this.st=this.getState(this.icdev)
if(st<0)
{
this.error(this.st)
this.opened=false
return
}
System.Windows.Forms.MessageBox.Show(this.getCardType())
this.deep(10)
}
注意在声明非托管方法的时候方法前面必须添加unsafe字段已标明这个方法是非托管的。在这个方法内部所使用的数据类型可以使用C#的类型也能够使用C或者C++的数据类型。
如果你只是做一般性的调用的话,上面的方法就足够用了。在使用的时候,托管的代码可以任意调用这些非托管的方法。需要注意的就是在调用非托管代码时最好做好异常检测。另外一个常见的问题就是通常非托管中使用的值类型与托管中的不同,而且经常非托管中的方法的参数使用的都是指针,这时就要注意怎样将托管类型转换为指针。例如在上面这个读卡dll中有一个int get_status(int icdev,int* state)方法,在这个方法中有一个参数时一个指针。声明这个方法的方式是:
[DllImport("Mwic_32.dll")]
public static unsafe extern int get_status(int icdev,int* state)
在使用这个方法的适合,就可能会出现歧异因为在C#中没有int*类型,因此我们就要利用C#的表现形式来为这个方法输入参数,方法如下:
/ <summary>
/ 检查读卡器的插卡状态
/ </summary>
/ <param name=icdev></param>
/ <returns></returns>
public unsafe int getState(int icdev)
{
int i=2
int st=RD.get_status(this.icdev,&i)
this.status=i
return i
}
上面的使用方法只是一个简单的调用,更加深入的使用还会复杂,在这里没法一下子说清楚。你可以参照MSDN上的一些相关的帮助进一步深入学习。我的这个使用方法只是我自己摸索出来的,如果有错误的地方请高手指正,谢谢!
我写了一个,不过我有个疑问:起始位及卡号是在一行里么?
试试吧:
/* ----------程序开始---------- */
/* Copyright (C) 2009 Tung Cheng <tungcheng2008@gmail.com>*/
#include <stdio.h>
#include <stdlib.h>
int main()
{
char data[20]
int i
int number = 0
scanf("%s", data)
int result[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
char charset[20] = "0123456789ABCDEF"
if (data[0] == 0x02) {
/* 转换成数字 */
for (i = 1i <= 10i ++) {
number *= 10
number += (int)(data[i] - '0')
}
i = 0
/* 转换成十六进制 */
do
{
result[i] = number % 16
number /= 16
i ++
} while (number != 0)
/* 输出 */
for (i --i >= 0i --)
printf("%c", charset[result[i]])
printf("\
")
}
return 0
}
/* ----------程辩段序结束---------- */
P.S. 你考试中最好不要问做灶橘纯团别人,这样不好。
是一款读卡器的驱动程序。读卡器驱动程序官方版能够支持现在市面大部分的读卡器驱动安装,它能够支持sd卡、cf卡、记忆棒、MMC卡手磨、XD卡、SM卡、TF卡等驱动,读昌做卡器驱动程序支持WinXP、Win7等 *** 作系统的使用,该驱动安装非常简单只要安装提示安装就好。
驱动程序,是一种可以使计算机和设备通信的特殊程序,可以说相当于硬件的接口, *** 作系统只能通过这个接口,才能控制硬件设备的工作毕迅斗,某设备的驱动程序未能正确安装,便不能正常工作。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)