Towitoko Chip-Drive Kartenlesegerät mit C++ ansprechen/auslesen



  • Hallo

    Desweiteren zwei Ordner "vc5" und "vc6" (die wahrscheinlich auf cbuilder5 und cbuilder6 hinweisen)

    Nein VC ist Visual Studio von Microsoft.
    Und CString ist eine Klasse aus der MFC, die es nur bei dem Visual Studio gibt. Das kannst du niemals mit dem Builder kompilieren.

    bis bald
    akari



  • Hmm...
    also, habe das bislang so:

    HINSTANCE hDll;
    long (__stdcall * SCardComand)(long *handle, char *Cmd, long *CmdLen,
                                   char *DataIn, long *DataInLen,
                                   char *DataOut, long *DataOutLen);
    long CmdLen,DataInLen,DataOutLen;
    char *Cmd,*DataIn,*DataOut;
    
    void test()
    {
      hDll = LoadLibrary("scard32.dll");
      if (hDll != NULL)
      {
        SCardComand = (long (__stdcall * )(long *handle, char *Cmd,
                                           long *CmdLen, char *DataIn,
                                           long *DataInLen, char *DataOut,
                                           long *DataOutLen))
        GetProcAddress(hDll,"SCardComand");
        Cmd = (char*)malloc(255);
        DataIn = (char*)malloc(255);
        DataOut = (char*)malloc(255);
        long ret;
    
        strcpy(Cmd,"System,Info");
        strcpy(DataIn,"");
        strcpy(DataOut,"");
        CmdLen = 11;
        DataInLen = 0;
        DataOutLen = 254;
        long handle = 0;
    
        ret = SCardComand(&handle,Cmd,&CmdLen,DataIn,&DataInLen,DataOut,&DataOutLen);
    
        CString text;
        text.Format("System,Info liefert %d und %s",ret,DataOut);
        MessageBox(NULL,text,text,MB_APPLMODAL);
      }
    

    Kann mir denn jemand sagen, was ich anstatt CString sonst nehmen kann? der Rest sollte - meines Wissens nach - doch eigentlich stimmen?

    Thx

    MWJK



  • Hallo

    Eine beliebige Zeichenkettenverarbeitung. Da wären AnsiString, std::string, char*...
    Das betrifft ja auch nur die Ausgabe, keine relevanten Zugriffe. Du kannst die Ausgabe zusammenbauen wie du willst.

    bis bald
    akari



  • akari schrieb:

    Hallo

    Eine beliebige Zeichenkettenverarbeitung. Da wären AnsiString, std::string, char*...
    Das betrifft ja auch nur die Ausgabe, keine relevanten Zugriffe. Du kannst die Ausgabe zusammenbauen wie du willst.

    bis bald
    akari

    Okay, danke.
    Nachdem ich CString nun in char* geändert habe, muss ich da noch etwas bestimmtes beachten?

    Gruß
    MWJK



  • Hallo

    Ja, das du den C-String ordentlich behandelst (Speicher reservieren, Funktionen mit Maximal-Größen verwenden, Speicher danach wieder freigeben). Eben das was zu den C-Grundkenntnissen gehört.

    bis bald
    akari



  • Hallo

    die VCL-Komponente installiert sich folgendermaßen.

    Erstelle ein neues VCL Package (Projekt -> Neu ...)
    Füge die Dateien Scardc32.pas ind Scardc32.dcr hinzu
    Kompiliere und installiere das Package

    Danach ist eine Komponente TSmartCard installiert 😃 .
    Das funktioniert mit cb6 und bds2006

    Vierl Erfolg



  • FireBirdSQL schrieb:

    Das funktioniert mit cb6 und bds2006

    Hallo,

    Hab aber nur cb5, weisst du, obs da auch geht? ich werds auf jeden fall mal ausprobieren, danke für den tipp!

    Gruß
    MWJK



  • Alles klar, soweit habe ich es und es wird auch etwas ausgegeben - komischerweise nur immer das gleiche und auch, wenn das Kartenlesegerät nicht angeschlossen ist ....

    Kann mir da vllt. jemand helfen, mit einen paar Tipps, wie man das hinbekommt und vllt. wie ich das hinkrieg, dass vllt. Name in nem Label steht und Vorname in einem, u.s.w. ??

    Thx

    MWJK



  • Da gibt es keine einfache Antwort.
    Es kommt auf die Art deiner Karte an.
    Für die KVK z.B. ist schon eine Lesefunktion in der Komponente vorhanden (s.Doku).
    Bei anderen Karten musst du die Struktur bzw. das Format kennen, um die gesuchten Daten aus der Karte auszulesen. Da hilft nur der Blick in die Doku 😉



  • FireBirdSQL schrieb:

    Da gibt es keine einfache Antwort.
    Es kommt auf die Art deiner Karte an.
    Für die KVK z.B. ist schon eine Lesefunktion in der Komponente vorhanden (s.Doku).
    Bei anderen Karten musst du die Struktur bzw. das Format kennen, um die gesuchten Daten aus der Karte auszulesen. Da hilft nur der Blick in die Doku 😉

    Geht nur um KVKs .....

    habe dort aber keine direkte Lesefunktion gefunden, bzw. das was ich da gefunden habe gibt leider nicht die Daten der Karten aus ....
    Das ist das einige, was ich ausgegeben bekomme:

    Handle=3
    Lng=GERMAN
    VersionCode=0214
    VersionText=CardServer V2.14.41
    ErrCode=0000
    ErrText=OK
    UsedMemHeap=74404
    UsedMemTotal=1048576

    und mehr leider nicht, bräuchte aber die Daten (Vorname, Name, Straße, Hausnummer, PLZ, Ort, u.s.w.) und das alles einzeln (in einzelnen Labels), wenns möglich wäre ....

    Gruß
    MWJK



  • Ist möglich.
    Anleitung in der Doku ab Seite 40 😃



  • Okay, alles klar,
    dann arbeite ich mich ab Seite 40 nochmal durch.

    Danke dir!!

    Gruß
    MWJK



  • Hmm.... habe zwar die Anleitung in der Doku genau befolgt, aber irgendwie bekomm ich da nichts ausgegeben ....

    Kann mir da vllt. nochmal jemand helfen, kennt sich damit jemand aus?
    Danke schonma!

    Gruß
    MWJK



  • Ok,
    kurz und knapp:

    char * c = new char[257];
    	TStringList *KartenInhalt = new TStringList();
    	try {
    		SmartCard->Comand("Apps,KVK",NULL,0,c,256);
    		KartenInhalt->Text = c;
    
    	}
    	catch(...)
    	{
    
    	}
    

    In der Stringliste KartenInhalt befinden sich jetzt die Werte 😮.



  • Hmm...
    gibt bei mir leider genau das selbe, wie vorher bei meinem Quelltext... bekomme nix ausgegeben, obwohl das Lämpchen am ChipDrive leuchtet ...

    Kann mir jemand da mal so ne komplett ultimativ-Lösung geben?

    THX!

    Gruß
    MWJK



  • Auf Wunsch von Jansen nehme ich diesen Thread wieder auf:
    Hat jemand einen Fertig-Code oder eine Lösung um KV-Karten mit dem CBuilder zu lesen über PC/SC oder SCard-Api?
    Ich habe keinen Ansatz wie ich da dran gehen soll.

    Danke Gruß Peter



  • Ich habe hier ein Stück Code und komme damit nicht zurecht. Wie muß das für den CBuilder aussehen?

    /* Beispiel zum Lesen einer Krankenversicherungskarte */
    #inlcude <windows.h> /* plattformspezifisches */
    #include <stdio.h>
    #include "ct_api.h"
    int main(void)
    {
    unsigned char sad, dad; /* source address, destination
    address werden als Zeiger über
    geben, um diese auch für die
    Antwort auswerten zu können */
    unsigned char response[300]; /* Feld für die Antwort der
    Funktion */
    unsigned char command[300]; /* Kommandos hier max. 300
    Zeichen lang */
    int i;
    unsigned int lenr;
    int ct_port = 2; /* Beispiel: COM 2 */
    int ctn = 1; /* erstes Terminal */
    /* logische Terminal Number und Port COM2 auswählen */
    if(CT_init(ctn, ct_port) != OK) { /* Rückgabewert OK ? */
    printf(“\nKartenleser nicht erreichbar. Port?”);
    return(1); /* Programm beenden */
    }
    /* RESET CT */
    sad = 2; /* source = Host (PC) */
    dad = 1; /* destination = CardTerminal
    (Kartenleser) */
    lenr = sizeof(response); /* Maximale länge der Antwort
    setzen */
    command[0] = 0x20; /* CLA */
    command[1] = 0x11; /* INS */
    command[2] = 0x00; /* P1 */
    command[3] = 0x00; /* P2 */
    command[4] = 0x00; /* LEN */
    /* Funktion CT_data aufrufen und Rückgabewert anzeigen */
    printf("Reset CT Returnwert: %d\nSW1-SW2:", CT_data(ctn, &dad,
    &sad, 5, command, &lenr, response));
    /* Response ausgeben */
    for(i=0;i<lenr;i++)
    printf("%02x ",response[i]);
    printf("\nBitte Karte einlegen und Taste drücken!\n");
    getch();
    /* RESET ICC */
    sad = 2; /* source = Host (PC) */
    dad = 1; /* destination = CardTerminal */
    lenr = sizeof(response); /* Maximale Länge der Antwort */
    command[0] = 0x20; /* CLA */
    command[1] = 0x12; /* INS */
    command[2] = 0x01; /* P1 */
    command[3] = 0x01; /* P2 */
    command[4] = 0x00; /* LEN */
    printf("Reset ICC Returnwert:%d\nSW1-SW2:", CT_data(ctn, &dad,
    &sad, 5, command, &lenr, response));
    for(i=0;i<lenr;i++)
    printf("%02x ",response[i]);
    /* READ BINARY */
    printf("\n\nKVK Daten:\n");
    sad = 2; /* source = Host (PC) */
    dad = 0; /* destination = Karte */
    lenr = sizeof(response); /* maximale Länge der Antwort */
    command[0] = 0x00; /* CLA */
    command[1] = 0xb0; /* INS */
    command[2] = 0x00; /* P1 */
    command[3] = 0x00; /* P2 */
    command[4] = 0x00; /* Le */
    printf("Read Binary Returnwert:%d\nDaten:",CT_data(ctn, &dad,
    &sad, 5, command, &lenr, response));
    for(i=0;i<lenr;i++)
    printf("%02x ",response[i]);
    /* DEACTIVATE ICC */
    sad = 2; /* source = HOST */
    dad = 1; /* destination = CardTerminal */
    lenr = sizeof(response); /* maximale Länge der Antwort */
    command[0] = 0x20; /* CLA */
    command[1] = 0x14; /* INS */
    command[2] = 0x01; /* P1 */
    command[3] = 0x00; /* P2 */
    printf("\n\nDeactivate Returnwert:%d\nSW1-SW2:",CT_data(ctn,
    &dad, &sad, 4, command, &lenr, response));
    for(i=0;i<lenr;i++)
    printf(" %02x ", response[i]);
    /* Schnittstelle schließen */
    printf("\nCT_close Returnwert:%d\n",CT_close(ctn));
    printf("\nKarte entnehmen!");
    return(0);
    }
    

    Danke Peter


Anmelden zum Antworten