我的示例应用程序出了问题。当我调试它时,我会收到12个错误,我不知道它们来自哪里。
1>main.obj : error LNK2019: unresolved external symbol _SCardEstablishContext@16 referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol _SCardReleaseContext@4 referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol _SCardListReadersW@16 referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol _SCardGetStatusChangeW@16 referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol _SCardConnectW@24 referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol _SCardDisconnect@8 referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol _SCardBeginTransaction@4 referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol _SCardEndTransaction@8 referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol _SCardStatusW@28 referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol _SCardTransmit@28 referenced in function _main
1>main.obj : error LNK2001: unresolved external symbol __imp__g_rgSCardT0Pci
这是我的代码:
// doł±czenie niezbędnych plików nagłówkowych
#include <stdio.h>
#include <stdlib.h>
// prototypy funkcji PC/SC
#include <winscard.h>
// wielko¶ć bufora na nazwę czytnika
#define MAX_READER_NAME_SIZE 40
// w systemie Windows nie ma definicji maksymalnego rozmiaru ATR
#ifndef MAX_ATR_SIZE
#define MAX_ATR_SIZE 33
#endif
int main(int argc, char **argv)
{
// kontekst poł±czenia do zarz±dcy zasobów
SCARDCONTEXT hContext;
// uchwyt poł±czenia do czytnika
SCARDHANDLE hCard;
// stan czytnika
SCARD_READERSTATE_A rgReaderStates[1];
// pomocnicze zmienne (długo¶ci buforów, stan czytnika, protokół)
DWORD dwReaderLen, dwState, dwProt, dwAtrLen;
DWORD dwPref, dwReaders, dwRespLen;
// bufor na nazwę czytnika
LPSTR pcReaders;
// bufor na listę czytników
LPSTR mszReaders;
// bufor na ATR
BYTE pbAtr[MAX_ATR_SIZE];
// bufor na odpowiedĽ karty
BYTE pbResp[10];
// pomocnicze zmienne
LPCSTR mszGroups;
LONG rv;
int i, p, iReader;
int iReaders[16];
// komenda GET CHALLENGE
BYTE GET_CHALLENGE[] = { 0x00, 0x84, 0x00, 0x00, 0x08 };
// nawi±zanie komunikacji z lokalnym zarz±dc± zasobów
printf("SCardEstablishContext : ");
rv = SCardEstablishContext(SCARD_SCOPE_SYSTEM, NULL, NULL, &hContext);
if (rv != SCARD_S_SUCCESS)
{
printf("failed\n");
return -1;
}
else printf("success\n");
// pobranie wielko¶ci ci±gu, jaki będzie potrzebny na listę
// dostępnych czytników w systemie
mszGroups = 0;
printf("SCardListReaders : ");
rv = SCardListReaders(hContext, (LPCWSTR)mszGroups, 0, &dwReaders);
if (rv != SCARD_S_SUCCESS)
{
SCardReleaseContext(hContext);
printf("failed\n");
return -1;
}
else printf("success\n");
// alokacja pamięci
mszReaders = (LPSTR)malloc(sizeof(char) * dwReaders);
// pobranie listy czytników
printf("SCardListReaders : ");
rv = SCardListReaders(hContext, (LPCWSTR)mszGroups, (LPWSTR)mszReaders, &dwReaders);
if (rv != SCARD_S_SUCCESS)
{
SCardReleaseContext(hContext);
free(mszReaders);
printf("failed\n");
return -1;
}
else printf("success\n");
// wydruk listy znalezionych czytników
p = 0;
for (i = 0; i < dwReaders - 1; ++i)
{
iReaders[++p] = i;
printf("Reader %02d: %s\n", p, &mszReaders[i]);
// przesunięcie bufora do kolejnej nazwy czytnika
while (mszReaders[++i] != '\0');
}
// wybór czytnika do dalszych operacji
do
{
printf("Select reader : ");
scanf_s("%d", &iReader);
} while (iReader > p || iReader <= 0);
// wypełnienie struktury stanu czytnika (nazwa czytnika i jego stan)
rgReaderStates[0].szReader = &mszReaders[iReaders[iReader]];
rgReaderStates[0].dwCurrentState = SCARD_STATE_EMPTY;
printf("Insert card...\n");
// oczekiwanie na zmianę stanu czytnika (włożenie karty)
printf("SCardGetStatusChange : ");
rv = SCardGetStatusChange(hContext, INFINITE, (LPSCARD_READERSTATEW)rgReaderStates, 1);
printf("[%02d]\n", rv);
// nawi±zanie poł±czenia z czytnikiem
printf("SCardConnect : ");
rv = SCardConnect(hContext, (LPWSTR)&mszReaders[iReaders[iReader]],
SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1,
&hCard, &dwPref);
if (rv != SCARD_S_SUCCESS)
{
SCardReleaseContext(hContext);
free(mszReaders);
printf("failed\n");
return -1;
}
else printf("success\n");
// sprawdzenie stanu karty w czytniku
printf("SCardStatus : ");
dwReaderLen = MAX_READER_NAME_SIZE;
pcReaders = (LPSTR)malloc(sizeof(char) * MAX_READER_NAME_SIZE);
rv = SCardStatus(hCard, (LPWSTR)pcReaders, &dwReaderLen, &dwState,
&dwProt, pbAtr, &dwAtrLen);
if (rv != SCARD_S_SUCCESS)
{
SCardDisconnect(hCard, SCARD_RESET_CARD);
SCardReleaseContext(hContext);
free(mszReaders);
free(pcReaders);
printf("failed\n");
return -1;
}
else printf("success\n");
// wydruk pobranych informacji
printf("Reader name : %s\n", pcReaders);
printf("Reader state : %lx\n", dwState);
printf("Reader protocol : %lx\n", dwProt - 1);
printf("Reader ATR size : %d\n", dwAtrLen);
printf("Reader ATR value : ");
// wydruk ATR
for (i = 0; i < dwAtrLen; i++)
{
printf("%02X ", pbAtr[i]);
}
printf("\n");
free(pcReaders);
// rozpoczęcie transakcji z kart±
printf("SCardBeginTransaction : ");
rv = SCardBeginTransaction(hCard);
if (rv != SCARD_S_SUCCESS)
{
SCardDisconnect(hCard, SCARD_RESET_CARD);
SCardReleaseContext(hContext);
printf("failed\n");
free(mszReaders);
return -1;
}
else printf("success\n");
// przesłanie do karty komendy GET CHALLENGE
printf("SCardTransmit : ");
dwRespLen = 10;
rv = SCardTransmit(hCard, SCARD_PCI_T0, GET_CHALLENGE,
5, NULL, pbResp, &dwRespLen);
if (rv != SCARD_S_SUCCESS)
{
SCardDisconnect(hCard, SCARD_RESET_CARD);
SCardReleaseContext(hContext);
printf("failed\n");
free(mszReaders);
return -1;
}
else printf("success\n");
printf("Response APDU : ");
// wydruk odpowiedzi karty
for (i = 0; i < dwRespLen; i++)
{
printf("%02X ", pbResp[i]);
}
printf("\n");
// zakończenie transakcji z kart±
printf("SCardEndTransaction : ");
rv = SCardEndTransaction(hCard, SCARD_LEAVE_CARD);
if (rv != SCARD_S_SUCCESS)
{
SCardDisconnect(hCard, SCARD_RESET_CARD);
SCardReleaseContext(hContext);
printf("failed\n");
free(mszReaders);
return -1;
}
else printf("success\n");
// odł±czenie od czytnika
printf("SCardDisconnect : ");
rv = SCardDisconnect(hCard, SCARD_UNPOWER_CARD);
if (rv != SCARD_S_SUCCESS)
{
SCardReleaseContext(hContext);
printf("failed\n");
free(mszReaders);
return -1;
}
else printf("success\n");
// odł±czenie od zarz±dcy zasobów PC/SC
printf("SCardReleaseContext : ");
rv = SCardReleaseContext(hContext);
if (rv != SCARD_S_SUCCESS)
{
printf("failed\n");
free(mszReaders);
return -1;
}
else printf("success\n");
// zwolnienie pamięci
free(mszReaders);
return 0;
}
我尝试用所有这些提示解决它: error LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup 并没有帮助我..
有人可以帮助我吗?
答案 0 :(得分:0)
您需要链接到WinSCard.lib。 它作为Windows SDK的一部分安装