SCardStatusA 函数 (winscard.h)
SCardStatus 函数在 读取器中提供 智能卡 的当前状态。 可以在成功调用 SCardConnect 之后,并在成功调用 SCardDisconnect之前调用它。 它不会影响读取器或
语法
LONG SCardStatusA(
[in] SCARDHANDLE hCard,
[out] LPSTR mszReaderNames,
[in, out, optional] LPDWORD pcchReaderLen,
[out, optional] LPDWORD pdwState,
[out, optional] LPDWORD pdwProtocol,
[out] LPBYTE pbAtr,
[in, out, optional] LPDWORD pcbAtrLen
);
参数
[in] hCard
从 SCardConnect返回的引用值。
[out] mszReaderNames
显示名称(多个字符串)的列表,当前连接的读取器是已知的。
[in, out, optional] pcchReaderLen
在输入时,提供 szReaderName 缓冲区的长度。
在输出中,接收读取器名称列表的实际长度(以字符为单位),包括尾随 NULL 字符。 如果将此缓冲区长度指定为SCARD_AUTOALLOCATE,则 szReaderName 转换为指向字节指针的指针,并接收包含多字符串结构的内存块的地址。
[out, optional] pdwState
读取器中智能卡的当前 状态。 成功后,它会收到以下状态指示器之一。
[out, optional] pdwProtocol
当前协议(如果有)。 仅当SCARD_SPECIFICMODE pdwState 返回的值时,返回的值才有意义。
价值 | 意义 |
---|---|
|
原始传输协议正在使用中。 |
|
ISO 7816/3 T=0 协议正在使用中。 |
|
ISO 7816/3 T=1 协议正在使用中。 |
[out] pbAtr
指向从当前插入的卡片 接收
[in, out, optional] pcbAtrLen
在输入时,提供 pbAtr 缓冲区的长度。 在输出中,接收 ATR 字符串中的字节数(最大为 32 字节)。 如果将此缓冲区长度指定为SCARD_AUTOALLOCATE,则 pbAtr 转换为指向字节指针的指针,并接收包含多字符串结构的内存块的地址。
返回值
如果函数在 读取器中成功提供 智能卡 的当前状态,则返回值SCARD_S_SUCCESS。
如果函数失败,它将返回错误代码。 有关详细信息,请参阅 智能卡返回值。
言论
SCardStatus 函数是 智能卡 和 读取器 访问函数。 有关其他访问函数的信息,请参阅 智能卡和读取器访问函数。
例子
以下示例演示如何确定智能卡的状态。
WCHAR szReader[200];
DWORD cch = 200;
BYTE bAttr[32];
DWORD cByte = 32;
DWORD dwState, dwProtocol;
LONG lReturn;
// Determine the status.
// hCardHandle was set by an earlier call to SCardConnect.
lReturn = SCardStatus(hCardHandle,
szReader,
&cch,
&dwState,
&dwProtocol,
(LPBYTE)&bAttr,
&cByte);
if ( SCARD_S_SUCCESS != lReturn )
{
printf("Failed SCardStatus\n");
exit(1); // or other appropriate action
}
// Examine retrieved status elements.
// Look at the reader name and card state.
printf("%S\n", szReader );
switch ( dwState )
{
case SCARD_ABSENT:
printf("Card absent.\n");
break;
case SCARD_PRESENT:
printf("Card present.\n");
break;
case SCARD_SWALLOWED:
printf("Card swallowed.\n");
break;
case SCARD_POWERED:
printf("Card has power.\n");
break;
case SCARD_NEGOTIABLE:
printf("Card reset and waiting PTS negotiation.\n");
break;
case SCARD_SPECIFIC:
printf("Card has specific communication protocols set.\n");
break;
default:
printf("Unknown or unexpected card state.\n");
break;
}
注意
winscard.h 标头将 SCardStatus 定义为一个别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将中性编码别名与不中性编码的代码混合使用可能会导致编译或运行时错误不匹配。 有关详细信息,请参阅函数原型的
要求
要求 | 价值 |
---|---|
最低支持的客户端 | Windows XP [仅限桌面应用] |
支持的最低服务器 | Windows Server 2003 [仅限桌面应用] |
目标平台 | 窗户 |
标头 | winscard.h |
库 | Winscard.lib |
DLL | Winscard.dll |