智能读卡器

来源:互联网 发布:java求一百以内的素数 编辑:程序博客网 时间:2024/04/29 01:10

先放着,等项目完整理

读写流程

一、连接设备
1、建立资源管理器的上下文
if(已有建立上下文)
SCardDisconnect(hCard, SCARD_UNPOWER_CARD);//先注销
SCardEstablishContext(SCARD_SCOPE_USER, 0/NULL, 0/NULL, ref hContext);
2、获得系统中安装的读卡器列表
SCardListReaders(hContext, null, null, ref pcchReaders)
SCardListReaders(hContext, null, ReadersList, ref pcchReaders)//ReadersList[]设备名称
二、读取智能卡
1、建立卡连接
if(已有连接)
SCardDisconnect(hCard, SCARD_UNPOWER_CARD);//关闭已有连接
SCardDisconnect(hCard, SCARD_UNPOWER_CARD)
2、初始化状态
SCardStatus(hCard, cbReader, ref ReaderLen, ref dwState, ref dwActProtocol, ref ATRVal[0],

ref ATRLen)
3、发送命名
SCardTransmit(hCard, ref ioRequest, ref SendBuff[0], SendLen, ref ioRequest, ref RecvBuff

[0], ref RecvLen)

 

 

//首先,建立资源管理器的上下文
 SCARDCONTEXT hSC;
 LONG lReturn;
 lReturn = SCardEstablishContext(SCARD_SCOPE_USER, NULL, NULL, &hSC);
 if ( lReturn!=SCARD_S_SUCCESS )
   printf("Failed SCardEstablishContext/n");
//获得系统中安装的读卡器列表
//下面是获得系统中安装的读卡器列表的代码:
 char mszReaders[1024];
 LPTSTR pReader, pReaderName[2];
DWORD dwLen=sizeof(mzsReaders);
int nReaders=0;
lReturn = SCardListReaders(hSC, NULL, (LPTSTR)mszReaders, &dwLen);
if ( lReturn==SCARD_S_SUCCESS )
{
pReader = (LPTSTR)pmszReaders;
 while (*pReader !='/0' )
{
if ( nReaders<2 ) //使用系统中前2个读卡器
pReaderName[nReaders++]=pReader;
printf("Reader: %S/n", pReader ); //下一个读卡器名 pReader = pReader + strlen(pReader) + 1; }
 }
//与读卡器(智能卡)连接
SCARDHANDLE hCardHandle[2];
 DWORD dwAP;
lReturn = SCardConnect( hContext, pReaderName[0], SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1, &hCardHandle[0], &dwAP );
if ( lReturn!=SCARD_S_SUCCESS )
{
printf("Failed SCardConnect/n");
exit(1);
 }
 LONG SCardConnect( SCARDCONTEXT hContext, LPCTSTR szReader, DWORD dwShareMode, DWORD dwPreferredProtocols, LPSCARDHANDLE phCard, LPDWORD pdwActiveProtocol );
/*
各个参数的含义:
(1)hContext:输入类型;ScardEstablishContext()建立的资源管理器上下文的句柄。
(2)szReader:输入类型;包含智能卡的读卡器名称(读卡器名称由ScardListReaders()给出)。
(3)dwShareMode:输入类型;应用程序对智能卡的操作方式,SCARD_SHARE_SHARED(多个应用共享同一个智能卡)、SCARD_SHARE_EXCLUSIVE(应用独占智能卡)、SCARD_SHARE_DIRECT(应用将智能卡作为私有用途,直接操纵智能卡,不允许其它应用访问智能卡)。
(4)dwPreferredProtocols:输入类型;连接使用的协议,SCARD_PROTOCOL_T0(使用T=0协议)、SCARD_PROTOCOL_T1(使用T=1协议)。
(5)phCard:输出类型;与智能卡连接的句柄。
(6)PdwActiveProtocol:输出类型;实际使用的协议。
*/