カードがリーダーにない場合、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);
カードに接続していない読者シリアル番号を取得する方法はありますか?
私の解決策は、PCSCリーダのシリアル番号を取得するための別の方法かもしれないと思います。 – vellotis
hCardHandleに 'NULL'を渡そうとしましたか? 'SCardGetAttrib'は' SCARD_ATTR_ICC_PRESENCE'の値を返すことができます。これは最初にカードを持っていなければならない場合にはあまり意味がありません。(btw私はこのハードウェアやAPIについては何も知らず、少し) –
私はもう少しこのSCardGetAttrib、docとソースをウェブ上で調べました。それはまだSCardGetAttribのために私はhCardHandleを取得する必要があるようです。 SCardGetAttribにhCardHandleとしてNULLを渡すのは意味がありません。あなたはどうにかして取得したいcardreaders属性を定義する必要があります。 SCardGetAtrribを使用することにより、このリーダーはCardHandleを介してアクセスされます。 私はIFDの勝利のハンドルを見つけようとしましたが、成功しませんでした。 PCSC-Liteでは、これらの属性にIFDHGetCapabilitiesを使用してアクセスします。 – vellotis