智能卡應(yīng)用程序的開發(fā)_第1頁
智能卡應(yīng)用程序的開發(fā)_第2頁
智能卡應(yīng)用程序的開發(fā)_第3頁
智能卡應(yīng)用程序的開發(fā)_第4頁
免費預(yù)覽已結(jié)束,剩余1頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、Windows系統(tǒng)提供了大量的API來方便的進行智能卡應(yīng)用程序的開發(fā),通過它們我們可以直接控制智能卡讀卡器對智能卡進行操作,也可以與智能卡建立直接的虛擬連接而不用考慮智能卡讀卡器。智能卡應(yīng)用程序開發(fā)的一般流程是:1)建立連接(使用函數(shù)SCardEstablishContext和SCardConnect,SCardReconnect);2)開始事務(wù)處理(使用函數(shù)SCardBeginTransaction);3)進行事務(wù)處理(使用函數(shù)SCardTransmit);4)結(jié)束事務(wù)處理(使用函數(shù)SCardEndTransaction);5)斷開連接(使用函數(shù)SCardDisconnect和SCardRe

2、leaseContext)。下面就具體看看各個函數(shù)的功能和用法吧!1) SCardEstablishContext函數(shù)用于建立進行設(shè)備數(shù)據(jù)庫操作的資源管理器上下文:LONGWINAPISCardEstablishContext(_inDWORDdwScope,/資源管理器上下文的范圍,取值如下:/SCARD_SCOPE_USER-數(shù)據(jù)庫操作在用戶域中/SCARD_SCOPE_SYSTEM-數(shù)據(jù)庫操作在系統(tǒng)域中,調(diào)用的應(yīng)用程序必須具有對任何數(shù)據(jù)庫操作的權(quán)限_inLPCVOIDpvReserved1,保留值,必須設(shè)為NULL_inLPCVOIDpvReserved2,保留值,必須設(shè)為NULL_ou

3、tLPSCARDCONTEXTphContext建立的資源管理器上下文句柄);返回值:成功時返回SCARD_S_SUCCESS;失敗時返回智能卡特定錯誤碼。函數(shù)返回的資源管理器上下文句柄可以被對設(shè)備數(shù)據(jù)庫進行查詢和管理的函數(shù)使用。如果一個客戶試圖在遠程會話中實現(xiàn)智能卡操作,例如運行在終端服務(wù)器上的客戶會話,而且客戶會話所在的操作系統(tǒng)不支持智能卡重定向,貝U函數(shù)SCardEstablishContext返回ERROR_BROKEN_PIPE。下面的代碼是建立資源管理器上下文的例子:SCARDCONTEXThSC;LONGlReturn;/EstablishthecontextlReturn=SC

4、ardEstablishContext(SCARD_SCOPE_USER,NULL,NULL,&hSC);if(SCARD_S_SUCCESS!=lReturn)printf(FailedSCardEstablishContext/n);else/Usethecontextasneeded,whendone,/freethecontextbycallingSCardReleaseContext2) SCardConnect函數(shù)利用特定資源管理器上下文,在應(yīng)用程序與包含在特定讀卡器中的智能卡之間建立一條連接:LONGWINAPISCardConnect(_inSCARDCONTEXThConte

5、xt,資源管理器上下文句柄_inLPCTSTRszReader,/包含目標智能卡的讀寫器名字_inDWORDdwShareMode,/標志其他應(yīng)用程序是否可以與該智能卡建立連接,取值如下:/SCARD_SHARE_SHARED-與其他應(yīng)用程序共享該智能卡SCARD_SHARE_EXCLUSIVE-獨占該智能卡/SCARD_SHARE_DIRECT-本應(yīng)用程序?qū)⒆x寫器作為私有使用,并且直接控制它,其他應(yīng)用程序沒有權(quán)限使用該讀寫器_inDWORDdwPreferredProtocols,可接受協(xié)議的位掩碼,可是如下的組合:/SCARD_PROTOCOL_T0-T=0是可接受協(xié)議/SCARD_PRO

6、TOCOL_T1-T=0是可接受協(xié)議。-該參數(shù)只有當dwShareMode是SCARD_SHARE_DIRECT時才能為0;這種情況下,驅(qū)動程序不會處理任何協(xié)議協(xié)商,直到將控制指令/IOCTL_SMARTCARD_SET_PROTOCOL發(fā)送給SCardControl_outLPSCARDHANDLEphCard,標識與特定讀卡器中智能卡連接的句柄_outLPDWORDpdwActiveProtocol/返回已建立的活動協(xié)議,取值如下:/SCARD_PROTOCOL_T0-T=0是活動協(xié)議;/SCARD_PROTOCOL_T1-T=1是活動協(xié)議;/SCARD_PROTOCOL_UNDEFINE

7、D-SCARD_SHARE_DIRECT標志被被設(shè)置,因此沒有任何協(xié)議協(xié)商發(fā)生;這時讀卡器中可能沒有智能卡);返回值:成功時返回SCARD_S_SUCCESS;失敗時返回智能卡錯誤碼。函數(shù)SCardConnect是智能卡和讀卡器訪問函數(shù),下面的代碼創(chuàng)建和讀卡器的連接,代碼中假定hContext是由函數(shù)SCardEstablishContext返回的有效的資源上下文句柄:SCARDHANDLEhCardHandle;LONGlReturn;DWORDdwAP;lReturn=SCardConnect(hContext,(LPCTSTR)RainbowTechnologiesSCR35310,SC

8、ARD_SHARE_SHARED,SCARD_PROTOCOL_T0|SCARD_PROTOCOL_T1,&hCardHandle,&dwAP);if(SCARD_S_SUCCESS!=lReturn)printf(FailedSCardConnect/n);return;/Usetheconnection.Displaytheactiveprotocolswitch(dwAP)caseSCARD_PROTOCOL_T0:printf(ActiveprotocolT0/n);break;caseSCARD_PROTOCOL_T1:printf(ActiveprotocolT1/n);break

9、;caseSCARD_PROTOCOL_UNDEFINED:default:printf(Activeprotocolunnegotiatedorunknown/n);break;/Remembertodisconnect(bycallingSCardDisconnect)3) SCardBeginTransaction函數(shù)在開始執(zhí)行前,先等待其他所有事務(wù)完成。當該事務(wù)開始后,其他應(yīng)用程序不允許在事務(wù)期間訪問智能卡:LONGWINAPISCardBeginTransaction(_inSCARDHANDLEhCard調(diào)用SCardConnect所獲得的連接句柄);返回值:成功時返回SCARD_

10、S_SUCCESS;失敗時返回智能卡錯誤代碼。注意:即使另一個進程或線程重置了智能卡,本函數(shù)仍然返回SCARD_S_SUCCESS,要確定智能卡是否被重置,可以在該函數(shù)調(diào)用后立即調(diào)用SCardStatus函數(shù)。SCardBeginTransaction函數(shù)同樣是智能卡和讀卡器訪問函數(shù)。下面的代碼片段展示了開始智能卡事務(wù):lReturn=SCardBeginTransaction(hCard);if(SCARD_S_SUCCESS!=lReturn)printf(FailedSCardBeginTransaction/n);4) SCardTransmit函數(shù)用來發(fā)送服務(wù)請求給智能卡,并接收從智

11、能卡返回的數(shù)據(jù):LONGWINAPISCardTransmit(_inSCARDHANDLEhCard,由函數(shù)SCardConnect返回的連接句柄_inLPCSCARD_IO_REQUESTpioSendPci,指向指令的協(xié)議頭結(jié)構(gòu)的指針一般使用系統(tǒng)定義的結(jié)構(gòu):/SCARD_PCI_T0(T=0協(xié)議);/SCARD_PCI_T1(T=1協(xié)議);/SCARD_PCI_RAW(原始協(xié)議)_inLPCBYTEpbSendBuffer,要發(fā)送到智能卡的數(shù)據(jù)的指針_inDWORDcbSendLength,/pbSendBuffer的字節(jié)長度_inout_optLPSCARD_IO_REQUESTpio

12、RecvPci,指向指令的協(xié)議頭結(jié)構(gòu)的指針,該參數(shù)當沒有協(xié)議控制信息PCI返回時可設(shè)為NULL_outLPBYTEpbRecvBuffer,/從智能卡返回的數(shù)據(jù)的指針_inoutLPDWORDpcbRecvLength/pbRecvBuffer的字節(jié)長度);返回值:成功時返回SCARD_S_SUCCESS;失敗時返回智能卡錯誤代碼。SCARD_IO_REQUEST結(jié)構(gòu)開啟一個協(xié)議控制信息結(jié)構(gòu),任何特定協(xié)議信息立即跟在這個結(jié)構(gòu)之后。該結(jié)構(gòu)的總長度必須根據(jù)底層硬件結(jié)構(gòu)字節(jié)長度進行對齊。例如,在Win32中,任何PCI(ProtocolControlInformation)信息的長度一定是4字節(jié)的整

13、數(shù)倍,即對齊到32位邊界。結(jié)構(gòu)定義如下:typedefstructDWORDdwProtocol;使用的協(xié)議DWORDcbPciLength;/本結(jié)構(gòu)的字節(jié)長度(加上任何跟隨的特定PCI信息長度)SCARD_IO_REQUEST;使用函數(shù)SCardTransmit的代碼片段:/Transmittherequest./lReturnisoftypeLONG./hCardHandlewassetbyapreviouscalltoSCardConnect./pbSendpointstothebufferofbytestosend./dwSendistheDWORDvalueforthenumbero

14、fbytestosend./pbRecvpointstothebufferforreturnedbytes./dwRecvistheDWORDvalueforthenumberofreturnedbytes.lReturn=SCardTransmit(hCardHandle,SCARD_PCI_T0,pbSend,dwSend,NULL,pbRecv,&dwRecv);if(SCARD_S_SUCCESS!=lReturn)printf(FailedSCardTransmit/n);exit(1);/orotherappropriateerroraction5) SCardEndTransac

15、tion函數(shù)完成先前聲明的一個事務(wù),并允許其他應(yīng)用程序恢復與智能卡的交互:LONGWINAPISCardEndTransaction(_inSCARDHANDLEhCard,由函數(shù)SCardConnect返回的連接句柄_inDWORDdwDisposition斷開連接時對智能卡的操作,取值如下:SCARD_EJECT_CARD-彈出智能卡;/SCARD_LEAVE_CARD-不做任何操作/SCARD_RESET_CARD-復位智能卡/SCARD_UNPOWER_CARD-給智能卡掉電);返回值:成功時返回SCARD_S_SUCCESS;失敗時返回智能卡錯誤代碼,例如:SCARD_W_RESET

16、_CARD-事務(wù)被釋放,但是將來任何和智能卡的通信都需要調(diào)用SCardReconnect函數(shù)。但是對于以下操作系統(tǒng):WindowsServer2008,WindowsVista,WindowsServer2003,WindowsXP和Windows2000而言,事務(wù)并沒有釋放掉,應(yīng)用程序必須馬上調(diào)用函數(shù)SCardDisconnect、SCardReconnect或SCardReleaseContext來避免該事務(wù)阻塞其他線程或進程與智能卡的交互。函數(shù)使用的代碼片段如下:lReturn=SCardEndTransaction(hCard,SCARD_LEAVE_CARD);if(SCARD_S_

17、SUCCESS!=lReturn)printf(FailedSCardEndTransaction/n);6) SCardDisconnect函數(shù)用來斷開先前在應(yīng)用程序和智能卡之間建立的連接:LONGWINAPISCardDisconnect(_inSCARDHANDLEhCard,由函數(shù)SCardConnect返回的連接句柄_inDWORDdwDisposition斷開連接時對智能卡的操作,取值如下:SCARD_EJECT_CARD-彈出智能卡;SCARD_LEAVE_CARD-不做任何操作/SCARD_RESET_CARD-復位智能卡/SCARD_UNPOWER_CARD-給智能卡掉電);

18、返回值:成功時是SCARD_S_SUCCESS;失敗時是智能卡錯誤代碼。如果一個先前建立連接的應(yīng)用程序退出前沒有調(diào)用SCardDisconnect函數(shù),則智能卡會自動重置。函數(shù)使用的代碼片段如下:lReturn=SCardDisconnect(hCardHandle,SCARD_LEAVE_CARD);if(SCARD_S_SUCCESS!=lReturn)printf(FailedSCardDisconnect/n);exit(1);/Orotherappropriateaction.7) SCardReconnect函數(shù)用來重新建立應(yīng)用程序與智能卡直接已存在的連接。該函數(shù)可以使智能卡句柄從

19、直接訪問變?yōu)槠胀ㄔL問,或者確認并清除阻止對智能卡進行訪問的錯誤狀態(tài):LONGWINAPISCardReconnect(_inSCARDHANDLEhCard,由SCardConnect返回的連接句柄_inDWORDdwShareMode,/標志其他應(yīng)用程序能否建立與該智能卡的連接,取值如下:/SCARD_SHARE_SHARED-可以共享;/SCARD_SHARE_EXCLUSIVE-獨占使用_inDWORDdwPreferredProtocols,該連接允許接受的協(xié)議,組合如下:/SCARD_PROTOCOL_T0-T=0是可接受的協(xié)議;/SCARD_PROTOCOL_T1-T=1是可接受的協(xié)議_inDWORDdwInitialization,初始化類型:/SCARD_LEAVE_CARD-不做任何操作/SCARD_RESET_CARD-重置智能卡(熱重置)/SCARD_UNPOWER_CARD-將智能卡掉電后再重置(冷重置)_out_optLPDWORDpdwActiveProtocol已建立的活動協(xié)議:/SCARD_PROTOCOL_T0-T=0是活動協(xié)議/SCARD_PROTOCO

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論