2011-08-04 79 views
5

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

次のコードは、カードがリーダーに存在する場合のみ動作します。それ以外の場合、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 pbAttr = NULL; 
DWORD cByte = SCARD_AUTOALLOCATE; 

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

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

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

カードに接続していない読者シリアル番号を取得する方法はありますか?

+0

私の解決策は、PCSCリーダのシリアル番号を取得するための別の方法かもしれないと思います。 – vellotis

+0

hCardHandleに 'NULL'を渡そうとしましたか? 'SCardGetAttrib'は' SCARD_ATTR_ICC_PRESENCE'の値を返すことができます。これは最初にカードを持っていなければならない場合にはあまり意味がありません。(btw私はこのハードウェアやAPIについては何も知らず、少し) –

+0

私はもう少しこのSCardGetAttrib、docとソースをウェブ上で調べました。それはまだSCardGetAttribのために私はhCardHandleを取得する必要があるようです。 SCardGetAttribにhCardHandleとしてNULLを渡すのは意味がありません。あなたはどうにかして取得したいcardreaders属性を定義する必要があります。 SCardGetAtrribを使用することにより、このリーダーはCardHandleを介してアクセスされます。 私はIFDの勝利のハンドルを見つけようとしましたが、成功しませんでした。 PCSC-Liteでは、これらの属性にIFDHGetCapabilitiesを使用してアクセスします。 – vellotis

答えて

5

たぶん私は少し遅れだ - とにかく...

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

+0

それは助けました。ありがとう! – vellotis

+0

SCardConnectを呼び出す前にカードリーダーにカードを置いて読者のシリアル番号を取得すると、シリアル番号を取得できません:( – Gintama

4

あなたは使用する必要があります。

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

を代わりに、使用してみてください:

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

szAvailRdrリーダー名(スマートカードの読み取り者名)を指し、hCardHandlescardconnectを使用する前に取得されたハンドルです。

これはあなたを続ける必要があります!

関連する問題