c++编写读卡器与IC卡交互信息的几个关键函数

前段时间为了测试读卡器的功能,编写了一个简单的测试工具,实现与IC卡交互信息的功能。懂得不是很多,直接上代码解释

        //获取环境句柄
        //SCardEstablishContext函数第一个参数也可选取SCARD_SCOPE_SYSTEM
		lReturn = SCardEstablishContext(SCARD_SCOPE_USER, NULL, NULL, &hSC);
		if ( lReturn != SCARD_S_SUCCESS )
		{
			return;
		}
		//建立设备表,其中定义参数DWORD ResponseLength = SCARD_AUTOALLOCATE;
		lReturn = SCardListReaders(hSC, NULL, (LPSTR)&pResponseBuffer, &ResponseLength);
		if(lReturn != SCARD_S_SUCCESS)
		{
			return;
		}
		//输出设备表,将设备列表输出到一个组合框里
		ptr = pResponseBuffer;
		while (*ptr != '\0')
		{
			m_ic_enumDev.InsertString(i, TEXT(ptr));//mfc组合框的操作
			ptr += strlen(ptr)+1;
			i++;
		}
		m_ic_enumDev.SetCurSel(0);//初始化组合框,显示第一个设备

通过以上操作,我们可以得到集成复合设备的不同读卡器名字,我们可以通过名字来进行连接卡片。


    //连接卡片
    /*
            第三个参数选择可以有以下几种情况
    		SCARD_SHARE_SHARED     多个应用共享同一个智能卡)
    		SCARD_SHARE_EXCLUSIVE   (应用独占智能卡)    
    		SCARD_SHARE_DIRECT(应用将智能卡作为私有用途,直接操纵智能卡,不允许其它应用访问智能卡)。
    		szReader:读卡器列表得到的名字
    		hCardHandle:连接卡片得到的句柄
    */
        lReturn = SCardConnect(hSC, (LPCTSTR)szReader, SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1, &hCardHandle, &dwAP );
		if ( lReturn!=SCARD_S_SUCCESS )
		{
			return;
		}
	//其中dwAP返回通讯协议,1对应T= 0协议,2对应T= 1协议。


	//断开卡片
	/*
	      //其中第二个参数可选择一下几个操作
		   SCARD_LEAVE_CARD(不做任何操作)
		   SCARD_RESET_CARD(复位智能卡)
		   SCARD_UNPOWER_CARD(给智能卡掉电)
		   SCARD_EJECT_CARD(弹出智能卡)。
	*/
		lReturn = SCardDisconnect(hCardHandle, SCARD_LEAVE_CARD);
		if ( lReturn!=SCARD_S_SUCCESS )
		{
			return;
		}

最后一步是与卡片交互信息

lReturn = SCardTransmit(hCardHandle, SCARD_PCI_T0, (LPBYTE)data, (DWORD)dwSend, NULL, (LPBYTE)pbRecv, &dwRecv );
if ( lReturn!=SCARD_S_SUCCESS )
{
	return;
}
//其中,第二个参数我们可以选择T= 0或者T=1(SCARD_PCI_T1)通讯协议。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值