现在的位置: 首页 > 综合 > 正文

《ASCE1885的信息安全》のWindows下智能卡应用程序的开发(二)

2013年02月01日 ⁄ 综合 ⁄ 共 3245字 ⁄ 字号 评论关闭

1SCardListReaders函数用来获取系统中在指定读卡器组集合中的读卡器名字列表(去掉重复的)。调用者提供一读卡器组列表,函数返回这些指定组里面的读卡器名字列表;无法标识的组名将被忽略。

 

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;

}

 

2SCardGetStatusChange函数阻塞程序的运行直到指定的智能卡的可用性发生改变。调用者以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;失败时:智能卡错误码。

 

3SCardLocateCards函数在参数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

【上篇】
【下篇】

抱歉!评论已关闭.