![]() |
CT - Api / Chipkarten
Hallo Leute,
ich sitze hier an einem Delphi Projekt und komme einfach nicht so recht weiter. Ich muss die Daten einer Chipkarte auslesen ( Krankenkassenkarte ) Eine Verbindung zum Cardreader stelle ich über die bekannte CT-Api Schnittstelle her. Die CT-Api dll habe ich eingebunden und über eine import unit die berühmten Funktionen CT_init, CT_data und CT_close nach Delphi geholt. Das alles klappt auch ohne Probleme, daher gehe ich davon aus, das ich bei der Definition der Funktionen keine Fehler gemacht habe. Das initalisieren über CT_init und der Close über CT_close funktionieren auch ohne Probleme. Nur mit dem CT_data Befehl tue ich mir schwer. Sobald ich den meiner Meinung nach richtigen Befehl starte bekomme ich regelmäßig eine Access Violation . Ich gehe davon aus, daß der Fehler in der Definition des commands liegt. Laut Beschreibung wird hier ein Zeiger ( Pointer ) auf eine Adresse mit dem command verlangt. Die Variable soll laut Beschreibung von der Form "byte" sein. Also habe ich ein Array of Byte definiert . Darin dann die einzelnen Hex Angaben ( in der Form $00 ) abgelegt . In der Doku ist leider nur ein VB Beispiel. Dort wird in der command Sektion einfach ein Verweis auf das erste Element des Byte Arrays gesetzt. Also in der Command Sektion einfach command [0] angegeben. Das funktioniert aber offensichtlich nicht. Dann versuchte ich, einen Pointer auf das Byte Array zu setzen und diesen anzugeben. Auch das wurde mit gleicher Fehlermeldung quittiert. Lange Rede, kurzer Unsinn: Weiss jemand wie man einen command für die Funktion CT_data richtig angibt ? Ich bin in Pointersachen leider ziemlich unerfahren. Bin für jeden Hinweis dankbar, Bis dann, Stephan PS: Wer bis hierhin gelesen hat, bekommt eine öfffentlich Belobigung ! Ich verspreche meine weiteren Beiträge hier werden kürzer !!! :mrgreen: |
Re: CT - Api / Chipkarten
poste mal 'n Stück Code - macht es leichter Käfer zu suchen, auch wenn ich Dir wahrscheinlich nicht helfen kann, so doch für Andere
Gruß |
Re: CT - Api / Chipkarten
Hallo Leuselator !
Hm, dachte ich mir ja, Problem ist nur, das ich im Moment den Code zu Hause habe und hier in der Mittagspause auf der Arbeit sitze. Schiebe heute abend die Codeparts nach. Vielleicht fällt Dir ja was dazu ein. Bis dann, Stephan |
Re: CT - Api / Chipkarten
Ich riskiere hier jetzt einfach mal nen Blindschuss... ich habe kein CardTerminal und deshalb auch keine ct-api... Und da das SDK kostenpflichtig zu sein scheint, ist es irgendwie auch nicht so einfach, nähere Informationen zu bekommen.
Das was ich jetzt hier mal testweise zusammengefummelt habe, fusst alles auf Informationen aus ![]()
Delphi-Quellcode:
Wie gesagt, ist ein "kalt" geschriebenes Programm, da ich es nicht testen kann.
// Ich vermute, die Funktionen müssten so oder so ähnlich deklariert sein bzw. werden
function CT_Init(const ctn, pn: Word): ShortInt; function CT_Data(const ctn: Word; var dad, sad: Byte; const lenc: Word; command: Pointer; var lenr: Word; response: Pointer): ShortInt; function CT_Close(const ctn: Word): ShortInt; procedure TestCT; const OK = 0; // Fehlercodes stehen noch mehr im Dokument var ctn, lenr: Word; dad, sad: Byte; command: Array of Byte; response: Array[0..1000] of Byte; Res: ShortInt; begin ctn := 1; // Terminal 1 an Comport 2... if CT_Init(ctn, 2) = OK then begin sad := 2; // Source = Host dad := 1; // Destination = Terminal lenr := SizeOf(response); command[0] := $20; // Commandobytes command[1] := $12; {...usw...} Res := CT_Data(ctn, dad, sad, SizeOf(command), @command, lenr, @response); CT_Close(ctn); end; end; Ich hoffe, das das eher hilfreich als verwirrend ist - mich würde dann am Ende auch mal interessieren, wie weit ich denn nun daneben lag. :mrgreen: Gruß Wormid |
Re: CT - Api / Chipkarten
Hallo Wormid,
danke für die rasche und ausführliche Hilfe ! Leider hat es nicht funktioniert. Wenn ich bei CT_data mein commando[0] durch Dein @commando ersetze funktioniert zwar die Compilierung aber der Fehler bleibt der gleiche: "EAccessViolation bei Adresse 10016D9 in Modul CTORG32.DLL" (Die Dll ist die CT-Api) Habe ich eine Chance irgendwie zu ermitteln welche Stelle genau den Fehler verursacht ? In einer Dll wohl weniger oder ? Hier mein Code mit dem ich es versuche: ************************************************** ******************** procedure TForm1.Button3Click(Sender: TObject); var daten:kdaten; rueckgabe:word; commando:array of byte; speicher:array of byte; begin // Select file legt die zu empfangende Datensection fest ! setlength(speicher,2); setlength(commando,8); commando[0]:=$00; commando[1]:=$04; commando[2]:=$00; commando[3]:=$88; commando[4]:=$02; commando[5]:=$3F; commando[6]:=$00; rueckgabe:=CT_data(1,02,01,Sizeof(commando),@comma ndo,2,@speicher); showmessage(inttostr(rueckgabe)); end; ************************************************** ******************* Wie gesagt, davor funktioniert der CT_init, der Terminal sollte also bereit sein. Die ganze Zeit bin ich davon ausgegangen, daß wenn ich die Funktion aus der Dll geholt habe und das Programm compiliert bei der Angabe der Parameter kein Fehler mehr vorliegen kann. Durch Probieren habe ich nun gemerkt, daß man sehr wohl völlig falsche Parameter definieren kann ( Byte statt Pointer ) und keine Exception beim Programmstart auftritt. Es könnte also sein das es schon an der Definition liegt. ***************** function CT_init(ctn:word;pn:word):word;stdcall; external 'CTORG32.DLL' function CT_data(ctn:word;dad:byte;sad:byte;lenc:word;comma nd:pointer;lenr:word;response:pointer):word;stdcal l;external 'CTORG32.DLL'; function CT_close(ctn:word):shortint;stdcall; external 'CTORG32.DLL' ***************** ´ So langsam werde ich ziemlich hilflos. Das muss doch irgendwie zu machen sein...... Stephan |
Re: CT - Api / Chipkarten
Wie sieht das mit der Variable "speicher" aus? Ist die mit 2 Bytes groß genug für die Rückgabe? Außerdem muss "lenr" als Variable übergeben werden, weil CT_Data wohl die tatsächliche länge der Antwort in "speicher" angibt.
Gruß Wormid P.S. Ansonsten weiss ich allerdings auch nicht weiterr.... :( |
Re: CT - Api / Chipkarten
Zitat:
Statt Sizeof(Command) nimm Length(Command), da Command als dynamisches array of Byte deklariert wurde. @Command = @Array of Byte = @Pointer = Zeiger auf Zeiger ist ebenfalls falsch. Die CT Library überschreibt somit die internen Verwaltungsdaten des dynamischen Arrays. Statt @Command benutze bitte @Command[0] oder Pointer(Command). Gruß Hagen PS: Ich wusste garnicht das man mir dem CT API Speicherkarten auslesen kann ? Normalerweise konnte man früher nur echte Prozessorkarten über deren ADPU ansprechen ! |
Re: CT - Api / Chipkarten
Öhm... merkt man das, das ich mir im Umgang mit Pointer auch nicht sicher genug bin, um damit auf dem Papier zu programmieren... :oops:
Aber man lernt ja nie aus. :hi: |
Re: CT - Api / Chipkarten
Halli Hallo !
@wormid : He, das war doch garnicht so schlecht. Trotzdem Danke .... @Hagen : Hm, ich habe Deine Änderungen eingebunden aber die Fehlermeldung bleibt die gleiche. Da scheint irgendwas generelles nicht zu stimmen. Hast Du mit der CT-Api gearbeitet ? Könntest Du mir einfach mal eine Rountine geben wie Du CT_data angesprochen hast ? Ich komme einfach nicht auf meinen Fehler. Ich schätze mal es ist mittlerweile ein ganz trivialer, ich komme nur nicht dahinter. Schon mal Danke, Stephan |
Re: CT - Api / Chipkarten
Nein, ich habe nicht mit der CT API gearbeitet, ich habe sie nur überflogen und analysiert. Für meine Zwecke war sie damals unzureichend und zu kompliziert. Nach meinem Wissenstand konnte die CT API damals überhaupt keine Speicherkarten o.ä. Nicht-Prozessorkarten ansteuern.
Chipkarte ist nicht gleich Chipkarte. Eine Speicherkarte hat ein echt primitiven Aufbau im Vergleich zu Prozessorkarten. Gruß Hagen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz