CT-API Chipkarte auslesen
-
ctapi.h
#ifndef CTAPIAPI #define CTAPIAPI #ifdef __cplusplus extern "C" { #endif /****************************************************************************/ /* return codes for CT_init, CT_data, CT_close: */ /****************************************************************************/ #define OK 0 /* Operation successful */ #define ERR_INVALID -1 /* parameter or data invalid */ #define ERR_CT -8 /* CT error (CT not ready) */ #define ERR_TRANS -10 /* transmission error */ #define ERR_MEMORY -11 /* error on allocate buffer */ #define ERR_HOST -127 /* abort by Host */ #define ERR_HTSI -128 /* HTSI error */ /****************************************************************************/ /* CT-API export functions: */ /****************************************************************************/ extern char WINAPI CT_init (unsigned short Ctn, /* logical terminal number */ unsigned short Pn); /* physical port number */ /* 0: auto detect */ /* 1: 1. reader */ /* 2: 2. reader */ /* 3: ... */ extern char WINAPI CT_close (unsigned short Ctn); /* logical terminal number */ extern char WINAPI CT_data (unsigned short Ctn, /* logical terminal number */ unsigned char FAR *Dad, /* destination address */ unsigned char FAR *Sad, /* source address */ unsigned short Lc, /* length of command in bytes */ unsigned char FAR *Cmd, /* command&data buffer */ unsigned short FAR *Lr, /* length of response in bytes */ unsigned char FAR *Rsp); /* answer */ /****************************************************************************/ #ifdef __cplusplus } #endif #endif
#include <windows.h> #include <stdio.h> #include <conio.h> #include "CTAPI.h" #define MAXMEM 1000 HINSTANCE hDLL; CT_INIT CT_init; CT_DATA CT_data; CT_CLOSE CT_close; int main(void) { unsigned char sad, dad; /* source/destination address,*/ /* als Byte deklariert */ unsigned char command[300]; /* Feld für Kommandotext mit max. 300 Zeichen Länge */ unsigned char response [MAXMEM]; /* Feld für Antwort der Funktion hier: max 1000 Zeichen */ unsigned short int ctn, lenr; /* card terminal number, Länge der Antwort */ char res; /* Funktions(rückgabe)wert */ ctn=1; /* Card Terminal 1*/ /* DLL laden und Funktionen zuweisen*/ hDLL = LoadLibrary("ctrsct32.dll"); if (hDLL == NULL) { printf("Failure - LoadLibrary\n"); return (2); //falls DLL nicht geladen werden konnte, PRG beenden } else printf("Success - LoadLibrary\n"); CT_init = (CT_init)GetProcAddress(hDLL,"CT_init"); //AB HIER GIBT ES PROBLEME CT_data = (CT_DATA)GetProcAddress(hDLL,"CT_data"); CT_close = (CT_CLOSE)GetProcAddress(hDLL,"CT_close"); // logische Terminal-Nummer 1 und Port COM2 auswählen (herstellerabhängig!) if (CT_init(1,1 ) != OK) { FreeLibrary(hDLL); // DLL aus dem Speicher entfernen printf("fehler2"); return(1); // falls Returncode von CT_init nicht OK, PRG beenden } // CT-Kommando REQUEST ICC (20 12 01 00 00 ) aufbauen und senden printf ("\nBitte Karte einlegen und eine Taste druecken!\n"); getch (); sad=2; // source = Host dad=1; // destination = Card Terminal lenr=MAXMEM; // maximale Länge der Antwort als Info an die Funktion command[0]=0x20; // CLA command[1]=0x12; // INS command[2]=0x01; // P1 command[3]=0x00; // P2 command[4]=0x00; // Le // Funktion (CT_data) aufrufen res=CT_data (ctn,&dad,&sad,5,command,&lenr,response); // Fehlerbehandlung hier nicht beschrieben // ... // nach Auswerfen der Karte mit CT-Kommando EJECT ICC printf("%s", res); res=CT_close(ctn); FreeLibrary (hDLL); //DLL aus dem Speicher entfernen getch(); return(0); }
Compiler: Default compiler Building Makefile: "C:\CCC\ctApi\Makefile.win" Führt make clean aus rm -f cttest.o ctap.exe g++.exe -c cttest.cpp -o cttest.o -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include" -I"C:/Dev-Cpp/include/c++/3.4.2/backward" -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32" -I"C:/Dev-Cpp/include/c++/3.4.2" -I"C:/Dev-Cpp/include" -I"C:/Programme/Microsoft Platform SDK/Include" cttest.cpp:7: error: `CT_INIT' does not name a type cttest.cpp:7: error: `CT_DATA' does not name a type cttest.cpp:7: error: `CT_CLOSE' does not name a type cttest.cpp: In function `int main()': cttest.cpp:28: error: assignment of function `char CT_init(short unsigned int, short unsigned int)' cttest.cpp:28: error: cannot convert `char ()(short unsigned int, short unsigned int)' to `char ()(short unsigned int, short unsigned int)' in assignment cttest.cpp:28: error: expected `;' before "GetProcAddress" cttest.cpp:29: error: `CT_DATA' undeclared (first use this function) cttest.cpp:29: error: (Each undeclared identifier is reported only once for each function it appears in.) cttest.cpp:29: error: expected `;' before "GetProcAddress" cttest.cpp:30: error: `CT_CLOSE' undeclared (first use this function) cttest.cpp:30: error: expected `;' before "GetProcAddress" make.exe: *** [cttest.o] Error 1 Ausführung beendet
Hallo,
ich verusuche eine Chipkarte mittels CTAPI auslesen. Die Hardware ist ein Reiner SCT Pinpad. Die DLL auf der ich zugreife ist die ctrsct32.dll, als Header benutze ich die oben abgebildete CTAPI.h .
Das einladen der DLL funktioniert. Und es gibt einen Success - LoadLibrary zurück.
Ich versuche das Projekt mit Dev C++ 4.9.9.2 zu kompilieren. Leider schaffe ich es nicht da es immer wieder zu Fehlern kommt. Ich weiss echt nicht mehr was an der Source verkehrt sein soll. Vieleicht fällt jemanden hier ja etwas auf.
-
stochi schrieb:
cttest.cpp:7: error: `CT_INIT' does not name a type cttest.cpp:7: error: `CT_DATA' does not name a type cttest.cpp:7: error: `CT_CLOSE' does not name a type
CT_INIT, CT_DATA und CT_CLOSE sind keine Typen, sondern Funktionen!
stochi schrieb:
// [...] CT_init = ( CT_init ) GetProcAddress( hDLL, "CT_init" ); CT_data = ( CT_DATA ) GetProcAddress( hDLL, "CT_data" ); CT_close = ( CT_CLOSE ) GetProcAddress( hDLL, "CT_close" ); // [...]
Du musst CT_init, CT_data und CT_close als Funktionspointer Deklarieren:
typedef void( *CT_init_t )( unsigned short, unsigned short ); typedef char( *CT_close_t )( unsigned short ); typedef char( *CT_data_t )( unsigned short, unsigned char FAR *, unsigned char FAR *, unsigned short, unsigned char FAR *, unsigned short FAR *, unsigned char FAR *); CT_init_t CT_init = ( CT_init_t ) GetProcAddress( hDLL, "CT_init" ); CT data_t CT_data = ( CT_data_t ) GetProcAddress( hDLL, "CT_data" ); CT_close_t CT_close = ( CT_close_t ) GetProcAddress( hDLL, "CT_close" );
Greetz, Swordfish
-
danke swordfish, ich kann das Projekt nun endlich kompilieren. Jetzt muss mich mal weiter schauen