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 🙂


Anmelden zum Antworten