VC封装USB接口的智能卡读写(应用层)
编译时需要包含头文件“Winscard.h”和库文件winscard.1ib。
第一步要通过初始化连接函数获得设备的连接句柄:
SCARDCONTEXT hSC = NULL;
LONG IReturn = 0:
IReturn=SCardEstablishContext(SCARDCOPE SER.NULL.NULL.& hSC):
第一个参数指定资源管理连接的范围,另一个可选值为SCARD_SCOPE_ SYSTEM。
第二步要取得读写器列表:
char szReaderNameList[MAX_RESPONSE]:
DWORD dwLength = O:
IReturn= SCardListReaders(hSC,NULL, szReaderNameList,&dwLength):
如果调用成功,则szReaderNameList中存放的是读写器的名字,如果有多个则中间用‘\O’分割,dwLength的值为返回的有效字符的长度,包括所有的‘\O’。得到读写器的名字后就可以取得某个读写器中智能卡的句柄.
第三步要取得指定读写器中卡片的句柄(与卡片建立连接):
要取得读写器列表中第一个读写器中卡片的句柄:
SCARDHANDLE hCardHandIe = NULL;
DW0RD dwActiveProtocol= O:
IReturn=SCardConnect{hSC,szReaderNameList,SCARD_SHARE_EXCLUSIVE,SCARD_ PROTOCOL_T0,
SCARD_PR0T0C0L_T1,& hCardHandle,&dwActiveProtoco1);
第三个参数表示连接的共享模式, 另外两个模式是SCARD_SHARE SHARED和SCARD_SHARE_DIRECT。第四个参数指定首选的通信协议类型包括T:0和T=1,dwActiveProtocol返回最终确定的通信协议类型。注意:调用此函数时读写器中如果没有智能卡则会返回相应错误。
以上两个函数可以实现卡片的检测??
第四步与卡片进行交互:
1、获得智能卡的句柄后就可以对卡片进行操作了,如读取ATR:
char szReaderName[300]:
DWORD dwATRLength = 40;
BYTE pbyATR[40];
DW 0RD dwCardState = 0:
IReturn = SCardStatus(hCardHandle,szReaderName, &dwLength, &dwCardState,
&dwActiveProtoco1, pbyATR.&dwATRLength):
调用成功后dwATRLength的值就是实际读出的ATR的长度。
2、向卡片发送命令并获得结果:
SCARD_IO_REQUEST ScardlORequest;
Scardl0Request.dwProtocol=dwActiveProtocol;
ScardlORequest.cbPciLength =sizeof(SCARD_IO_REQUEST);
BYTE pbyCommand[20];
//此处加入设置要发送的命令的代码...
BYTE pbyReceived[100];
DW0RD dwRecLength = sizeof(pbyReceived);
IReturn = SCardTransmit(hCardHandle, &Scard10Request,pbyCommand,5,NULL,pbyReceived,& dwRecLength):
ScardlORequest.dwProtocol的值应该设置为最终确定的通信协议类型,第四个参数指定要发送的命令的长度,如果调用成功,则dwRecLength的值就是收到的应答的长度。
注:在开始事务处理前要调用SCardBeginTransaction(hCardHandle)。该函数启动一个事务,启动前等待对hCardHandle操作的所以事务结束。启动后阻塞所有对该卡片存取的应用程序。
结束事务处理时要调用SCardBeginTransaction(hCardHandle,SCARD_LEAVE_CARD)。该函数对应于之前声明的事务,使得其他应用程序对卡片的访问激活。
第五步断开与卡片的连接:
当对卡片的操作完成后应该断开与卡片的连接:
IReturn=SCardDisconnect{hCardHandle,SCARD_UNPOWER_ CARD);
第二个参数指定断开连接时读写器要执行的操作,其他的可选值包括SCARD_LEAVE CARD、SCARD_RESET CARD 和SCARD_EJECT_CARD。
第六步释放读卡器设备句柄:
在对所有的读写器的操作都完成以后,需要释放设备的连接句柄:SCardReleaseContext(hSC);