首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用WinSCard获取PCSC读卡器序列号

使用WinSCard获取PCSC读卡器序列号
EN

Stack Overflow用户
提问于 2011-08-04 19:43:05
回答 2查看 8.8K关注 0票数 6

如果读卡器中没有卡,我在获取PCSC读卡器序列号时遇到问题。我使用的是winscard.dll和c++。

以下代码仅适用于读卡器中有卡的情况。否则,将不检索SCardHandle。我还没有找到任何其他方法来获得SCardHandle。

代码语言:javascript
复制
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); 

有没有一种方法可以在不连接卡的情况下获得读卡器序列号?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-15 16:00:39

也许我来晚了点但不管怎样..。

您可以使用带有SCardConnect的SCARD_SHARE_DIRECT标志直接连接到读卡器。至少对我们来说这样做没问题..(我们使用协议标志"0x00")

票数 5
EN

Stack Overflow用户

发布于 2012-07-12 16:57:45

您应该使用:

代码语言:javascript
复制
lReturn = SCardConnect(hResManager,szAvailRdr,SCARD_SHARE_SHARED,SCARD_PROTOCOL_T1,
                            &hCardHandle,
                            &dwActProtocol);

相反,请尝试使用:

代码语言:javascript
复制
lReturn = SCardConnect(hResManager,szAvailRdr,SCARD_SHARE_DIRECT,
                      NULL,
                      &hCardHandle,
                      NULL);

其中szAvailRdr是指读卡器名称(智能卡读卡器名称),hCardHandle是在使用scardconnect之前获得的句柄。

这应该能让你坚持下去!

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6940824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档