SCardTransmit 函式 (winscard.h)
SCardTransmit函式會將服務要求傳送至智慧卡,並預期會從卡片接收資料。
語法
LONG SCardTransmit(
[in] SCARDHANDLE hCard,
[in] LPCSCARD_IO_REQUEST pioSendPci,
[in] LPCBYTE pbSendBuffer,
[in] DWORD cbSendLength,
[in, out, optional] LPSCARD_IO_REQUEST pioRecvPci,
[out] LPBYTE pbRecvBuffer,
[in, out] LPDWORD pcbRecvLength
);
參數
[in] hCard
從 SCardConnect 函式傳回的參考值。
[in] pioSendPci
指示之通訊協定標頭結構的指標。 此緩衝區的格式為 SCARD_IO_REQUEST 結構,後面接著 PCI) (特定的通訊協定控制資訊。
針對 T=0、 T=1和原始通訊協定,PCI 結構是常數。 智慧卡子系統提供全域 T=0、T=1 或原始 PCI 結構,您可以分別使用符號SCARD_PCI_T0、SCARD_PCI_T1和SCARD_PCI_RAW來參考。
[in] pbSendBuffer
要寫入卡片之實際資料的指標。
針對 T=0,資料參數會根據下列結構放入 pbSendBuffer 指向的位址:
struct {
BYTE
bCla, // the instruction class
bIns, // the instruction code
bP1, // parameter to the instruction
bP2, // parameter to the instruction
bP3; // size of I/O transfer
} CmdBytes;
傳送至卡片的資料應該緊接在傳送緩衝區之後。 在特殊情況下,不會傳送任何資料到卡片,而且不會傳回任何資料,則不會傳送 bP3 。
成員 | 意義 |
---|---|
|
T=0 指令類別。 |
|
T=0 指令類別中的指令程式碼。 |
|
完成指令程式碼的參考代碼。 |
|
在命令期間要傳輸的資料位元組數目,每個 ISO 7816-4,第 8.2.1 節。 |
[in] cbSendLength
pbSendBuffer參數的長度,以位元組為單位。
若為 T=0,在特殊情況下,不會傳送任何資料給卡片,且不會傳回任何資料,此長度必須反映 bP3 成員未傳送;長度應該是 sizeof(CmdBytes) - sizeof(BYTE)
。
[in, out, optional] pioRecvPci
指示的通訊協定標頭結構的指標,後面接著一個緩衝區,用來接收任何傳回的通訊協定控制資訊, (PCI 所使用通訊協定的特定) 。 如果未傳回 PCI,這個參數可以是 Null 。
[out] pbRecvBuffer
從卡片傳回之任何資料的指標。
若為 T=0,資料會緊接著 SW1 和 SW2 狀態位元組。 如果未從卡片傳回任何資料,則此緩衝區只會包含 SW1 和 SW2 狀態位元組。
[in, out] pcbRecvLength
提供 pbRecvBuffer 參數的長度,並以位元組為單位,並接收從智慧卡接收的實際位元組數目。
無法SCARD_AUTOALLOCATE此值,因為 SCardTransmit 不支援SCARD_AUTOALLOCATE。
針對 T=0,接收緩衝區必須至少有兩個位元組長,才能接收 SW1 和 SW2 狀態位元組。
傳回值
如果函式成功將服務要求傳送至 智慧卡,則會SCARD_S_SUCCESS傳回值。
如果函式失敗,它會傳回錯誤碼。 如需詳細資訊,請參閱 智慧卡傳回值。
備註
SCardTransmit函式是智慧卡和讀取器存取函式。 如需其他存取函式的相關資訊,請參閱 智慧卡和讀取器存取函式。
針對 T=0 通訊協定,所收到的資料是 SW1 和 SW2 狀態碼,可能前面會有回應資料。 下列段落提供用來傳輸資料併發出命令之傳送和接收緩衝區的相關資訊。
範例
下列範例示範如何將服務要求傳送至智慧卡。
// Transmit the request.
// lReturn is of type LONG.
// hCardHandle was set by a previous call to SCardConnect.
// pbSend points to the buffer of bytes to send.
// dwSend is the DWORD value for the number of bytes to send.
// pbRecv points to the buffer for returned bytes.
// dwRecv is the DWORD value for the number of returned bytes.
lReturn = SCardTransmit(hCardHandle,
SCARD_PCI_T0,
pbSend,
dwSend,
NULL,
pbRecv,
&dwRecv );
if ( SCARD_S_SUCCESS != lReturn )
{
printf("Failed SCardTransmit\n");
exit(1); // or other appropriate error action
}
規格需求
最低支援的用戶端 | Windows XP [僅限傳統型應用程式] |
最低支援的伺服器 | Windows Server 2003 [僅限桌面應用程式] |
目標平台 | Windows |
標頭 | winscard.h |
程式庫 | Winscard.lib |
Dll | Winscard.dll |