2015-01-04 53 views
0

我的示例應用程序出現問題。當我調試它時,我得到了12個錯誤,我不知道它們來自哪裏。錯誤LNK2019:無法解析的外部符號_SCardEstablishContext @ 16在函數_main中引用

1>main.obj : error LNK2019: unresolved external symbol [email protected] referenced in function _main 
1>main.obj : error LNK2019: unresolved external symbol [email protected] referenced in function _main 
1>main.obj : error LNK2019: unresolved external symbol [email protected] referenced in function _main 
1>main.obj : error LNK2019: unresolved external symbol [email protected] referenced in function _main 
1>main.obj : error LNK2019: unresolved external symbol [email protected] referenced in function _main 
1>main.obj : error LNK2019: unresolved external symbol [email protected] referenced in function _main 
1>main.obj : error LNK2019: unresolved external symbol [email protected] referenced in function _main 
1>main.obj : error LNK2019: unresolved external symbol [email protected] referenced in function _main 
1>main.obj : error LNK2019: unresolved external symbol [email protected] referenced in function _main 
1>main.obj : error LNK2019: unresolved external symbol [email protected] 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 [email protected] referenced in function ___tmainCRTStartup 並沒有任何幫助我..

有誰可以幫幫我嗎?

+1

與Winscard.lib鏈接。 (其他依賴項)。 – user2672165 2015-01-04 10:50:59

+0

非常感謝,我忘了! – user3448282 2015-01-04 10:54:23

回答

0

您需要鏈接到WinSCard.lib。 它作爲Windows SDK的一部分進行安裝

相關問題