如果您在 Windows 上工作,则需要使用 WinSCard API,如果您使用 unix,则使用 PCSC。由于标准的原因,这两个 API 非常相似,但 WinSCard API 更大,提供了更多可用的功能。这两个 API 是用 C 语言实现的,但是您可以很容易地将它们封装在 C++ 中。我只是想指出你是否要将这两个 API 封装到 C++ 中以便在 Windows 和 unix 上使用它,看看智能卡协议的数值,这些在这些平台上是不同的。
基础知识:
您需要建立上下文(就像创建智能卡管理器一样)
SCardEstablishContext
它需要 4 个参数,但对于基本使用,您只需要 2 个,范围和指向上下文句柄的指针。
LPSCARDCONTEXT hSCardContext = NULL;
int ret = SCardEstablishContext(SCARD_SCOPE_USER, NULL, NULL, &hSCardContext);
if (ret != ERROR_SUCCES) ... // handle error
智能卡分为不同的组。所以有一些函数可以与组一起工作,创建它等等。
获取读者列表(对于您实际上并不需要群组的基本应用程序)
SCardListReaders
它需要4个参数,上下文,指向组的指针,指向阅读器的指针和指向阅读器计数的指针
你可以这样用它
char *szGroups = NULL;
long readers = 0;
int res = SCardListReaders(hSCardContext, szGroups, NULL, &readers);
// handle errors
您首先要计算读者数量。现在您可以为实际的阅读器分配内存了。
szReaders = (char *) malloc(sizeof(char) * readers);
int res = SCardListReaders(hSCardContext, szGroups, szReaders , &readers);
现在您已连接阅读器列表。
您可以像这样连接到阅读器
LPSCARDHANDLE hSCard = NULL;
long activeProtocols = 0;
int ret = SCardConnect(hSCardContext, myReader, SCARD_SHARE_EXCLUSIVE, SCARD_PROTOCOL_TX, &hSCard, &activeProtocols);
// .. handle errors
指定协议,共享模式,如果您正在处理敏感的东西需要保护操作系统不会与事务交互,则使用 SCARD_SHARE_EXCLUSIVE 共享模式。
再一次,如果你是为 windows 和 unix 包装(unix 没有 SCARD_PROTOCOL_TX 协议),但它是这两个 SCARD_PROTOCOL_T0 | 的表示。 SCARD_PROTOCOL_T1。
myReader 是已连接阅读器的名称。喜欢(LPCTSTR)"Dermalog LF10"
您可以从 SCardListReaders 函数中获取这些阅读器名称。
现在您已连接到一张卡。使用 SCARD_SHARE_EXCLUSIVE 共享时不要忘记释放智能卡上下文,因为它会死锁。
使用SCardDisconnect断开连接,它需要2个参数,SmartCard句柄和配置,对于基本应用SCARD_LEAVE_CARD配置应该是可以的。它指定你不想对卡做任何特殊的事情,你不想弹出或其他什么。
交易更复杂,因为您需要了解 SCard 标准以及不了解的内容。但我涵盖了基础知识。
请记住,此代码可能无法编译,您需要改进类型,对于 Windows,您需要将这些类型转换为 WinAPI 类型,如 LPCTSTR,它不会抱怨,而 unix 没有此类类型,因此您需要解决也有这些问题。