6

カードがリーダーに存在しない場合、PCSC リーダーのシリアル番号を取得する際に問題があります。winscard.dll と c++ を使用しています。

次のコードは、カードがリーダーに存在する場合にのみ機能します。それ以外の場合、SCardHandle は取得されません。SCardHandle を取得する他の方法は見つかりませんでした。

SCARDHANDLE hCardHandle;
SCARDCONTEXT    hSC;
WCHAR   pCardReaderName[256];
LONG lReturn;

lReturn = SCardEstablishContext(SCARD_SCOPE_USER, 0, 0, &hSC);

if (lReturn != SCARD_S_SUCCESS)
{
    Console::WriteLine("SCardEstablishContext() failed\n");
    return;
}

my_select_reader(hSC, pCardReaderName); // just shows reader names in console and requires you to pick one

// connect to smart card
DWORD   dwAP;

lReturn = SCardConnect( hSC,
                (LPCWSTR)pCardReaderName,
                SCARD_SHARE_SHARED,
                SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1 | SCARD_PROTOCOL_RAW,
                &hCardHandle,
                &dwAP );

if ( SCARD_S_SUCCESS != lReturn )
{
    Console::WriteLine("Failed SCardConnect\n");
    exit(1);  // Or other appropriate action.
}

// get reader serial no
LPBYTE   pbAtr = NULL;
DWORD    cByte = SCARD_AUTOALLOCATE;

lReturn = SCardGetAttrib(hCardHandle,
                SCARD_ATTR_VENDOR_IFD_SERIAL_NO,
                (LPBYTE)&pbAtr,
                &cByte);

if ( SCARD_S_SUCCESS != lReturn )
{
    Console::WriteLine("Failed to retrieve Reader Serial\n");
    exit(1);  // Or other appropriate action.
}

printf("serial no: %s", pbAtr);

SCardFreeMemory(hCardHandle, pbAtr); 

カードに接続せずにリーダーのシリアル番号を取得する方法はありますか?

4

2 に答える 2

5

多分私は少し遅れています - とにかく...

SCardConnect で SCARD_SHARE_DIRECT フラグを使用して、カード リーダーに直接接続できます。少なくとも私たちではこれで問題なく動作します.. (「0x00」のプロトコル フラグを使用します)

于 2011-10-15T08:00:38.967 に答える
4

次のものを使用する必要があります。

lReturn = SCardConnect(hResManager,szAvailRdr,SCARD_SHARE_SHARED,SCARD_PROTOCOL_T1,
                            &hCardHandle,
                            &dwActProtocol);

代わりに、以下を使用してみてください。

lReturn = SCardConnect(hResManager,szAvailRdr,SCARD_SHARE_DIRECT,
                      NULL,
                      &hCardHandle,
                      NULL);

ここでszAvailRdr、はリーダー名(スマートカードリーダー名)を指し、はhCardHandleを使用する前に取得したハンドルscardconnectです。

これはあなたを続けるはずです!

于 2012-07-12T08:57:44.997 に答える