Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi CT - Api / Chipkarten (https://www.delphipraxis.net/10624-ct-api-chipkarten.html)

skullcrusher 22. Okt 2003 11:47


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:

Leuselator 22. Okt 2003 12:00

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ß

skullcrusher 22. Okt 2003 12:07

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

Wormid 22. Okt 2003 13:44

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 diesem Dokument.

Delphi-Quellcode:
// 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;
Wie gesagt, ist ein "kalt" geschriebenes Programm, da ich es nicht testen kann.
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

skullcrusher 22. Okt 2003 21:07

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

Wormid 22. Okt 2003 21:20

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.... :(

negaH 22. Okt 2003 23:41

Re: CT - Api / Chipkarten
 
Zitat:

Delphi-Quellcode:
var
  command: array of byte;
begin
  ...
    Res := CT_Data(ctn, dad, sad, SizeOf(command), @command, lenr, @response);
  ...
end;

SizeOf(Command) = SizeOf(array of Byte) = SizeOf(Pointer) = 4

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 !

Wormid 23. Okt 2003 09:12

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:

skullcrusher 23. Okt 2003 22:02

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

negaH 24. Okt 2003 00:07

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 23:34 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz