2011-08-04 56 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。將NULL作爲hCardHandle傳遞給SCardGetAttrib是沒有意義的。您不知何故必須定義您想要獲取的讀卡器屬性。通過使用SCardGetAtrrib,可以通過CardHandle訪問此閱讀器。 我也試圖找到IFD處理勝利,但沒有成功。在PCSC-Lite中,這些屬性通過使用IFDHGetCapabilities進行訪問。 – vellotis

回答

5

也許我有點晚了 - 但無論如何...

您可以直接連接到使用SCARD_SHARE_DIRECT標誌與SCardConnect讀卡器。至少在我們這工作得很好。(我們用 「0×00」 的協議標誌)

+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指的是讀卡器名稱(智能卡讀卡器名稱),並且hCardHandle是在使用scardconnect之前獲得的手柄。

這應該讓你繼續前進!