智能卡应用程序的开发
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Windows系统提供了大量的API来方便的进行智能卡应用程序的开发,通过它们我们可以直接控制智能卡读卡器对智能卡进行操作,也可以与智能卡建立直接的虚拟连接而不用考虑智能卡读卡器。
智能卡应用程序开发的一般流程是:
1)建立连接(使用函数SCardEstablishContext和SCardConnect,SCardReconnect);
2)开始事务处理(使用函数SCardBeginTransaction);
3)进行事务处理(使用函数SCardTransmit);
4)结束事务处理(使用函数SCardEndTransaction);
5)断开连接(使用函数SCardDisconnect和SCardReleaseContext)。
下面就具体看看各个函数的功能和用法吧!
1)SCardEstablishContext函数用于建立进行设备数据库操作的资源管理器上下文:
LONG WINAPI SCardEstablishContext(
__in DWORD dwScope, //资源管理器上下文的范围,取值如下:
//SCARD_SCOPE_USER---数据库操作在用户域中
//SCARD_SCOPE_SYSTEM---数据库操作在系统域中,调用的应用程序
//必须具有对任何数据库操作的权限
__in LPCVOID pvReserved1, //保留值,必须设为NULL
__in LPCVOID pvReserved2, //保留值,必须设为NULL
__out LPSCARDCONTEXT phContext //建立的资源管理器上下文句柄
);
返回值:成功时返回SCARD_S_SUCCESS;失败时返回智能卡特定错误码。
函数返回的资源管理器上下文句柄可以被对设备数据库进行查询和管理的函数使用。如果一个客户试图在远程会话中实现智能卡操作,例如运行在终端服务器上的客户会话,而且客户会话所在的操作系统不支持智能卡重定向,则函数SCardEstablishContext返回ERROR_BROKEN_PIPE。
下面的代码是建立资源管理器上下文的例子:
SCARDCONTEXT hSC;
LONG lReturn;
//Establish the context
lReturn = SCardEstablishContext(SCARD_SCOPE_USER,
NULL, NULL, &hSC);
if(SCARD_S_SUCCESS != lReturn)
printf("Failed SCardEstablishContext/n");
else
{
//Use the context as needed, when done,
//free the context by calling SCardReleaseContext
}
2)SCardConnect函数利用特定资源管理器上下文,在应用程序与包含在特定读卡器中的智能卡之间建立一条连接:
LONG WINAPI SCardConnect(
__in SCARDCONTEXT hContext, //资源管理器上下文句柄
__in LPCTSTR szReader, //包含目标智能卡的读写器名字
__in DWORD dwShareMode, //标志其他应用程序是否可以与该智能卡建立连接,取值如下:
//SCARD_SHARE_SHARED---与其他应用程序共享该智能卡
//SCARD_SHARE_EXCLUSIVE---独占该智能卡
//SCARD_SHARE_DIRECT---本应用程序将读写器作为私有使用,并且直接
//控制它,其他应用程序没有权限使用该读写器
__in DWORD dwPreferredProtocols, //可接受协议的位掩码,可是如下的组合:
//SCARD_PROTOCOL_T0--- T=0是可接受协议
//SCARD_PROTOCOL_T1--- T=0是可接受协议
//0--- 该参数只有当dwShareMode是SCARD_SHARE_DIRECT时才能为0;
//这种情况下,驱动程序不会处理任何协议协商,直到将控制指令
//IOCTL_SMARTCARD_SET_PROTOCOL发送给SCardControl
__out LPSCARDHANDLE phCard, //标识与特定读卡器中智能卡连接的句柄
__out LPDWORD pdwActiveProtocol //返回已建立的活动协议,取值如下:
//SCARD_PROTOCOL_T0--- T=0是活动协议;
//SCARD_PROTOCOL_T1--- T=1是活动协议;
//SCARD_PROTOCOL_UNDEFINED---SCARD_SHARE_DIRECT标志被
//被设置,因此没有任何协议协商发生;这时读卡器中可能没有智能卡
);
返回值:成功时返回SCARD_S_SUCCESS;失败时返回智能卡错误码。
函数SCardConnect是智能卡和读卡器访问函数,下面的代码创建和读卡器的连接,代码中假定hContext 是由函数SCardEstablishContext返回的有效的资源上下文句柄:
SCARDHANDLE hCardHandle;
LONG lReturn;
DWORD dwAP;
lReturn = SCardConnect(hContext, (LPCTSTR)"Rainbow Technologies SCR3531 0",
SCARD_SHARE_SHARED,
SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1,
&hCardHandle, &dwAP);
if(SCARD_S_SUCCESS != lReturn)
{
printf("Failed SCardConnect/n");
return;
}
//Use the connection. Display the active protocol
switch(dwAP)
{
case SCARD_PROTOCOL_T0:
printf("Active protocol T0/n");
break;
case SCARD_PROTOCOL_T1: