错误LNK2019:函数_main中引用了未解析的外部符号_SCardEstablishContext @ 16

时间:2015-01-04 10:39:19

标签: c++

我的示例应用程序出了问题。当我调试它时,我会收到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 并没有帮助我..

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

您需要链接到WinSCard.lib。 它作为Windows SDK的一部分安装