VC封装USB接口的智能卡读写(应用层)

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);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值