Чтение ДАННЫХ с карт-ридера Magneti c MT188 с использованием C ++ - PullRequest
1 голос
/ 27 января 2020

Я пытаюсь прочитать данные с картридера c magneti, его модель MT188. Устройство чтения карт поставляется с DLL и do c для функций в DLL. процесс чтения карты выглядит следующим образом.

HANDLE APIENTRY CommOpenWithBaut(UINT nPort, UINT _data) 

открыть серийный пример связи: CommOpenWithBaut (1,9600);.

int APIENTRY CarderCheckSt(HANDLE hComHandle, unsigned char &PewSt, unsigned char &CardType, unsigned char &CardSt, unsigned char &PowerSt) 

проверить состояние устройства.

int APIENTRY MagRead(HANDLE hComHandle,BYTE *MagData,int &lenth) 

чтение данных карточки Magneti c

int APIENTRY CommClose(HANDLE hComHandle); 

Закрыть порт после чтения карты.

Каждая функция имеет возвращаемое значение. Это пример cout<<Magread<<endl;, который дает значение 00007FF792E41258. Что я делаю неправильно? Как я могу использовать эти функции правильно?

вот мой основной.

int main(int arg, char* argc[])
{
    CommOpenWithBaut(1,9600);
    cout<< "This is the cards data:  " << MagRead << endl;
    cout << "This is the cards status:  " << CarderCheckSt << endl;
    CommClose;
}

обновления:

Я получаю эту ошибку при попытке запустить программу:

LNK2019 unresolved external symbol "__declspec(dllimport) void * __cdecl CommOpenWithBaut(unsigned int,unsigned int)" (__imp_?CommOpenWithBaut@@YAPEAXII@Z) referenced in function main 

Это мой заголовочный файл:

#include <iostream>
#include <windows.h>

#ifdef Modulev188_EXPORTS
#define Modulev188_API __declspec(dllexport)
#else
#define Modulev188_API __declspec(dllimport)
#endif

Modulev188_API HANDLE  CommOpenWithBaut(UINT nPort, UINT _data);
Modulev188_API int  CommClose(HANDLE hComHandle);
Modulev188_API int  CarderCheckSt(HANDLE hComHandle, unsigned char& PewSt, unsigned char& CardType, unsigned char& CardSt, unsigned char& PowerSt);
Modulev188_API int  CarderVersion(HANDLE hComHandle, unsigned char* VersionNo, int& lenth);
//DLLEXPORT int WINAPI ContactCPU_ColdReset(HANDLE hComHandle, BYTE* _CPUTYPE, BYTE* _exData, int* _exdataLen);
//DLLEXPORT int WINAPI ContactCPU_Dormancy(HANDLE hComHandle);
Modulev188_API int  ContactCPU_CAPDU(HANDLE hComHandle, int _dataLen, BYTE* _APDUData, BYTE* _exData, int* _exdataLen);
Modulev188_API int  SIM_Reset(HANDLE hComHandle, BYTE _VOLTAGE, BYTE _SIMNo, BYTE& _SIMTYPE, BYTE* _exData, int& _exdataLen);
Modulev188_API int  SIM_C_APDU(HANDLE hComHandle, BYTE SIMNo, int _dataLen, BYTE* _APDUData, BYTE* _exData, int& _exdataLen);
Modulev188_API int  SIM_CardClose(HANDLE hComHandle);
Modulev188_API int  MagRead(HANDLE hComHandle, BYTE* MagData, int& lenth);
Modulev188_API int  MagCleaner(HANDLE hComHandle);

1 Ответ

2 голосов
/ 27 января 2020

Вы на самом деле не вызываете MagRead, CarderCheckSt или CommClose, потому что вы не вызываете их как функции с круглыми скобками и параметрами. Вы просто распечатываете их как указатели на функции, поэтому значения, которые вы видите, представляют адрес точки входа в функцию.

Вместо этого вам необходимо предоставить подходящие параметры для каждой функции. Из функции 'open' вы получите дескриптор, который вы передадите всем последующим функциям.

#include <iostream>

extern "C" {    
    #include <mt188.h> // The header for your C library
}

using namespace std;

int main(int argc, char* argv[])
{
    // Open the device

    HANDLE port = CommOpenWithBaut(1, 9600);

    if (port == 0)
    {
        cerr << "Cannot open device";
        return -1;
    }

    // Read status

    unsigned char PewSt = 0;
    unsigned char CardType = 0;
    unsigned char CardSt = 0;
    unsigned char PowerSt = 0;

    int rc = CarderCheckSt(port, PewSt, CardType, CardSt, PowerSt);

    // Read buffer of data

    int bufferSize = 128;
    BYTE buffer[bufferSize];

    int bytesRead = MagRead(port, buffer, bufferSize);

    //

    CommClose(port);

    return 0;
}
...