一、官方的API说明:
可循环等待读身份证函数
int IDC_ReadCard(int ComPort,int TimeOut,char *IDInfo,int IDInfo_Size,char *PhotoPath)
输入参数: 输入参数 名称 长度(字节) 说明
ComPort 端口号 串口:1-16 USB: 1001
TimeOut 超时值 读身份证等待时间(单位 秒)
IDInfo_Size IDInfo 预分配内存大小 5120
IDInfo 预分配内存大小 (5120)
PhotoPath 芯片头像路径+文件名 称
256 包括头像路径和文件名, 如 1: c:\\zp.bmp 如 2: c:\\zp.jpg
输出参数:
输出参数 名称 长度(字节) 说明 IDInfo 身份证信息 5120 姓名|性别|民族|出生|住 址|号码|签发机关|起始有 效期|终止有效期|预留信 息|芯片图片 jpg 信息 (Base64 码)
返回值:
值 说明 0 成功 非 0 失败(见错误代码表)
二、官方的的C++代码示例:官方没有.Net示例....
typedef int (_stdcall * FunIDC_ReadCard) (int ComNo,int TimeOut,char *buf,int buf_size,char*PhotoPath);
Fun IDC_ReadCardIDC_ReadCard;
HMODULE hMod;
CStringDllPath="sdtapi.dll";
hMod =LoadLibrary(DllPath);
IDC_ReadCard=(FunIDC_ReadCard)GetProcAddress(hMod,_T("IDC_ReadCard"));
int rc,ComNo=1001,TimeOut=10;
char buf[5120],PhotoPath[256];
memset(buf,0,sizeof(buf));
strcpy(PhotoPath,”c://zp.bmp”);
rc=IDC_ReadCard(ComNo,TimeOut,buf,5120,PhotoPath) ;
FreeLibrary(hMod);
三、问题来了:
怎么用C#调用这个sdtapi.dll啊?
我自己写了一个,完全不行,跑不起来,问题出在哪里呢?
[DllImport("sdtapi.dll")]
private static extern int IDC_ReadCard(int ComPort, int TimeOut, ref char[] IDInfo, int IDInfo_Size, ref char[] PhotoPath);
private void button2_Click(object sender, EventArgs e)
{
char[] info = new char[5120];
string jpgpath="D:\\aa.jpg";
char[] path = new char[256];
path = jpgpath.ToCharArray();
IDC_ReadCard(1001, 5, ref info, 5120,ref path);
}
错误提示:
“System.BadImageFormatException”类型的未经处理的异常在 Test.exe 中发生
其他信息: 试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)
------解决思路----------------------
目测你写的数据类型有问题
private static extern int IDC_ReadCard(int ComPort, int TimeOut, ref char[] IDInfo, int IDInfo_Size, ref char[] PhotoPath);
------解决思路----------------------
数据类型问题
private static extern int IDC_ReadCard(int ComPort, int TimeOut, ref StringBuilder IDInfo, int IDInfo_Size, ref StringBuilder PhotoPath);
------解决思路----------------------
所有 char[] 都改为 byte[],用 Encoding.Default.GetString 和 GetBytes 与字符串转换。