1)SCardListReaders函数用来获取系统中在指定读卡器组集合中的读卡器名字列表(去掉重复的)。调用者提供一读卡器组列表,函数返回这些指定组里面的读卡器名字列表;无法标识的组名将被忽略。
LONG WINAPI SCardListReaders(
__in SCARDCONTEXT hContext, //由SCardEstablishContext()建立的资源管理器上下文,
//不能为NULL
__in_opt LPCTSTR mszGroups, //读卡器组名,为NULL时表示列出系统中所有读卡器
__out LPTSTR mszReaders, //系统中指定读卡器组中的读卡器的名字,这是一个多重字符串
//各个名字之间用‘/0’分隔,最后一个名字后面是两个连续的‘/0’
//当该参数为NULL时,函数在pcchReaders中返回实际所需长度
__inout LPDWORD pcchReaders //mszReaders的有效字符长度,包括所有的‘/0’。当该参数指定
//为SCARD_AUTOALLOCATE时,mszReaders将被转为指向字节指针的
//指针,用于接收包含多重字符串的内存块地址,该内存块必须使用函数
//SCardFreeMemory来释放
);
返回值:成功时是SCARD_S_SUCCESS;当指定组中没有读卡器时,返回SCARD_E_NO_READERS_AVAILABLE;否则返回其他智能卡错误码。
下面是该函数的实例代码:
LPTSTR pmszReaders = NULL;
LPTSTR pReader;
LONG lReturn, lReturn2;
DWORD cch = SCARD_AUTOALLOCATE;
// Retrieve the list the readers.
// hSC was set by a previous call to SCardEstablishContext.
lReturn = SCardListReaders(hSC,
NULL,
(LPTSTR)&pmszReaders,
&cch );
switch( lReturn )
{
case SCARD_E_NO_READERS_AVAILABLE:
printf("Reader is not in groups./n");
// Take appropriate action.
// ...
break;
case SCARD_S_SUCCESS:
// Do something with the multi string of readers.
// Output the values.
// A double-null terminates the list of values.
pReader = pmszReaders;
while ( '/0' != *pReader )
{
// Display the value.
printf("Reader: %S/n", pReader );
// Advance to the next value.
pReader = pReader + wcslen((wchar_t *)pReader) + 1;
}
// Free the memory.
lReturn2 = SCardFreeMemory( hSC,
pmszReaders );
if ( SCARD_S_SUCCESS != lReturn2 )
printf("Failed SCardFreeMemory/n");
break;
default:
printf("Failed SCardListReaders/n");
// Take appropriate action.
// ...
break;
}
2)SCardGetStatusChange函数阻塞程序的运行直到指定的智能卡的可用性发生改变。调用者以SCARD_READERSTAT数组的形式提供需要监控的读卡器列表,以及最长等待的时间(ms)。
LONG WINAPI SCardGetStatusChange(
__in SCARDCONTEXT hContext, //由SCardEstablishContext()建立的资源管理器上下文
__in DWORD dwTimeout, //最长等待的毫秒数,0表示函数立即返回;INFINITE表示一直等待
__inout LPSCARD_READERSTATE rgReaderStates, //SCARD_READERSTATE结构数组,指定监控的
//读卡器,同时用于接收返回结果。为了接收新的智能卡到来的通知,需要将
//SCARD_READERSTATE结构中的szReader参数设为////?PnP?//Notification,其他成员
//设为0;注意:该结构数组中的每个结构的所有成员必须初始化为0后再根据需要设置
//其他值,否则,函数将在包含远程读卡器的情况下返回失败
__in DWORD cReaders //rgReaderStates结构中的元素个数
);
返回值:成功时:SCARD_S_SUCCESS;失败时:智能卡错误码。
3)SCardLocateCards函数在参数rgReaderStates中指定的读卡器列表中查找由参数mszCards指定的智能卡,并立即返回结果:
LONG WINAPI SCardLocateCards(
__in SCARDCONTEXT hContext, //由SCardEstablishContext()建立的资源管理器上下文
__in LPCTSTR mszCards, //包含要查找的智能卡的多重字符串
__inout LPSCARD_READERSTATE rgReaderStates, //SCARD_READERSTATE结构数组,作为输入参数
//时,指定在其中查找的读卡器列表;作为输出参数时,接收查找结果
__in DWORD cReaders //rgReaderStates结构中元素个数
);
返回值:成功时:SCARD_S_SUCCESS;失败时:智能卡错误码。
该函数和SCardGetStatusChange函数一起使用时特别有用,当调用SCardLocateCards函数找不到匹配的智能卡时,应用程序可以使用SCardGetStatusChange函数来等待智能卡可用性的改变。
实例代码如下:
// Copyright (c) Microsoft Corporation. All rights reserved.
#include <stdio.h>
#include <winscard.h>
#include <tchar.h>
#pragma comment(lib