0
我希望能夠檢測到智能卡讀卡器,然後檢測智能卡是否已插入到智能卡讀卡器中。當運行下面的代碼時,出現Debug Assertion失敗的錯誤。無法檢測到連接的智能卡
#include <stdio.h>
#include <winscard.h>
#include <tchar.h>
#pragma comment(lib, "winscard.lib")
HRESULT __cdecl main()
{
HRESULT hr = S_OK;
LPTSTR szReaders, szRdr;
DWORD cchReaders = SCARD_AUTOALLOCATE;
DWORD dwI, dwRdrCount;
SCARD_READERSTATE rgscState[MAXIMUM_SMARTCARD_READERS];
TCHAR szCard[MAX_PATH];
SCARDCONTEXT hSC;
LONG lReturn;
// Establish the card to watch for.
// Multiple cards can be looked for, but
// this sample looks for only one card.
_tcscat_s (szCard, MAX_PATH * sizeof(TCHAR), TEXT("GemSAFE"));
szCard[lstrlen(szCard) + 1] = 0; // Double trailing zero.
// Establish a context.
lReturn = SCardEstablishContext(SCARD_SCOPE_USER,
NULL,
NULL,
&hSC);
if (SCARD_S_SUCCESS != lReturn)
{
printf("Failed SCardEstablishContext\n");
exit(1);
}
// Determine which readers are available.
lReturn = SCardListReaders(hSC,
NULL,
(LPTSTR)&szReaders,
&cchReaders);
if (SCARD_S_SUCCESS != lReturn)
{
printf("Failed SCardListReaders\n");
exit(1);
}
// Place the readers into the state array.
szRdr = szReaders;
for (dwI = 0; dwI < MAXIMUM_SMARTCARD_READERS; dwI++)
{
if (0 == *szRdr)
break;
rgscState[dwI].szReader = szRdr;
rgscState[dwI].dwCurrentState = SCARD_STATE_UNAWARE;
szRdr += lstrlen(szRdr) + 1;
}
dwRdrCount = dwI;
// If any readers are available, proceed.
if (0 != dwRdrCount)
{
for (;;)
{
// Look for the card.
lReturn = SCardLocateCards(hSC,
szCard,
rgscState,
dwRdrCount);
if (SCARD_S_SUCCESS != lReturn)
{
printf("Failed SCardLocateCards\n");
exit(1);
}
// Look through the array of readers.
for (dwI=0; dwI < dwRdrCount; dwI++)
{
if (0 != (SCARD_STATE_ATRMATCH &
rgscState[dwI].dwEventState))
{
_tprintf(TEXT("Card '%s' found in reader '%s'.\n"),
szCard,
rgscState[dwI].szReader);
SCardFreeMemory(hSC,
szReaders);
return 0; // Context will be release automatically.
}
// Update the state.
rgscState[dwI].dwCurrentState = rgscState[dwI].dwEventState;
}
// Card not found yet; wait until there is a change.
lReturn = SCardGetStatusChange(hSC,
INFINITE, // infinite wait
rgscState,
dwRdrCount);
if (SCARD_S_SUCCESS != lReturn)
{
printf("Failed SCardGetStatusChange\n");
exit(1);
}
} // for (;;)
}
else
printf("No readers available\n");
// Release the context.
lReturn = SCardReleaseContext(hSC);
if (SCARD_S_SUCCESS != lReturn)
{
printf("Failed SCardReleaseContext\n");
exit(1);
}
SCardFreeMemory(hSC,
szReaders);
return hr;
}
錯誤:
更新: 我加
memset(rgscState, 0, sizeof(SCARD_READERSTATE);
的代碼和它的工作。但它不能找到插入智能卡讀卡器的智能卡。當檢測到卡時,應該忽略下面的代碼,但是因爲它沒有找到插入的智能卡,所以它運行下面的代碼。
if (SCARD_S_SUCCESS != lReturn)
{
printf("Failed SCardLocateCards\n");
exit(1);
}