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

读取器中智能卡的当前 状态。 成功后,它会收到以下状态指示器之一。

价值 意义
SCARD_ABSENT
读取器中没有卡片。
SCARD_PRESENT
读卡器中有一张卡片,但尚未进入使用位置。
SCARD_SWALLOWED
读取器中有一张卡片可供使用。 卡未开机。
SCARD_POWERED
电源正在提供给卡,但读取器驱动程序不知道卡的模式。
SCARD_NEGOTIABLE
卡已重置,正在等待 PTS 协商。
SCARD_SPECIFIC
该卡已重置, 已建立特定的 通信协议。

[out, optional] pdwProtocol

当前协议(如果有)。 仅当SCARD_SPECIFICMODE pdwState 返回的值时,返回的值才有意义。

价值 意义
SCARD_PROTOCOL_RAW
原始传输协议正在使用中。
SCARD_PROTOCOL_T0
ISO 7816/3 T=0 协议正在使用中。
SCARD_PROTOCOL_T1
ISO 7816/3 T=1 协议正在使用中。

[out] pbAtr

指向从当前插入的卡片 接收 ATR 字符串(如果可用)的 32 字节缓冲区的指针。

[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

另请参阅

SCardConnect

SCardDisconnect