2011-08-04 20 views
5

के साथ पीसीएससी रीडर सीरियल नंबर प्राप्त करना मुझे पाठक में कार्ड मौजूद नहीं होने पर पीसीएससी रीडर सीरियल नंबर प्राप्त करने में समस्या है। मैं winscard.dll और C++ का उपयोग कर रहा हूँ।WinSCard

निम्नलिखित कोड केवल मामले के लिए काम करेगा यदि कार्ड पाठक में मौजूद है। अन्यथा 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

मुझे लगता है कि मेरे लिए एक समाधान पीसीएससी रीडर सीरियल नंबर को पुनर्प्राप्त करने का कोई और तरीका हो सकता है। – vellotis

+0

क्या आपने एचकार्डहैंडल के लिए 'न्यूल' पास करने का प्रयास किया है? ऐसा लगता है कि 'SCARDGetAttrib' एक 'SCARD_ATTR_ICC_PRESENCE' मान वापस कर सकता है, जो आपको पहले कार्ड पेश करने के लिए बहुत समझ में नहीं आता है ... (btw मुझे इस हार्डवेयर या एपीआई के बारे में कुछ भी पता नहीं है, बस दस्तावेज़ों को ब्राउज़ किया गया है थोड़ा) –

+0

मैंने वेब पर इस SCardGetAttrib, दस्तावेज़ और स्रोत को थोड़ा और अधिक जांच की। यह अभी भी लगता है कि ScardGetAttrib के लिए मुझे hCardHandle प्राप्त करना है। HCardHandle के रूप में SCARDGetAttrib को NULL पास करने का अर्थ नहीं है। आपको किसी भी तरह से परिभाषित करना होगा कि कौन से कार्ड्रेडर्स विशेषताओं को आप प्राप्त करना चाहते हैं। SCardGetAtrrib का उपयोग करके इस पाठक को कार्डहैंडल के माध्यम से एक्सेस किया जाता है। मैंने जीत के लिए आईएफडी हैंडल खोजने की भी कोशिश की, लेकिन सफलता के बिना। पीसीएससी-लाइट में इन विशेषताओं को IFDHGetCapabilities का उपयोग करके एक्सेस किया जाता है। – vellotis

उत्तर

5

हो सकता है कि मैं थोड़ी देर हो चुकी हूँ - लेकिन वैसे भी ...

आप SCardConnect साथ SCARD_SHARE_DIRECT ध्वज का उपयोग कार्ड रीडर के लिए सीधे कनेक्ट कर सकते हैं। कम से कम हमारे साथ इस ठीक काम करता है .. (हम "0x00" का एक प्रोटोकॉल ध्वज का उपयोग करें)

+0

इससे मदद मिली। धन्यवाद! – vellotis

+0

इससे मदद मिली, लेकिन अगर हम पाठक के सीरियल नंबर प्राप्त करने के लिए स्कार्डकनेक्ट को कॉल करने से पहले कार्ड रीडर पर कार्ड डालते हैं, तो इसे सीरियल नंबर नहीं मिल सकता है :( – Gintama

4

आप का उपयोग किया जाना चाहिए:

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

जहां szAvailRdr:

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

इसके बजाय, का उपयोग करके देखें scardconnect का उपयोग करने से पहले पाठक नाम (स्मार्टकार्ड रीडनेम) और hCardHandle को प्राप्त एक हैंडल को संदर्भित करता है।

यह आपको जारी रखना चाहिए!