前段时间为了测试读卡器的功能,编写了一个简单的测试工具,实现与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)通讯协议。