Autor Beitrag
oOXTCOo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 141

Windows XP Prof. 3
Delphi 7
BeitragVerfasst: So 14.06.09 17:23 
hallo!

folgendes problem...

ich verwende für die steuerung meines smartcard readers und dessen smartcard die komponente von noobi. die version die er auf seiner website hat lässt sich super installieren und ist dann sichtbar unter "more" pcsc installiert.

das problem ist, das diese smartcard komponente veraltet ist und nicht mit meiner karte zusammen funktioniert. er hat mir eine neue komonente gesendet, die meine karte auch unterstützt. das problem ist, das diese komonente keine sichtbare ist. sie lässt sich auch so nicht installieren. er meinte ich muss die alte einfach deinstallieren und die neuen dateien in meinen suchpfad geben.

genau das habe ich getan:
alte deinstalliert.
neue dateien sind nun im suchpfand unter delphi im ./lib verzeichnis...

doch ich bekomme es nicht zum laufen...


kann mir jemand helfen?

ich hänge die datei mal an die ich bekommen habe...
(ist die aktuellste version)

Moderiert von user profile iconNarses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
Einloggen, um Attachments anzusehen!
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 14.06.09 17:27 
Wenn ich das richtig sehe, ist das keine Komponente, sondern lediglich eine Klasse. Das ist aber auch kein Beinbruch, da Du sie zur Laufzeit erstellen und dann damit arbeiten kannst. Dazu musst Du nur die entsprechende Unit einbinden.
oOXTCOo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 141

Windows XP Prof. 3
Delphi 7
BeitragVerfasst: So 14.06.09 17:30 
user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:
Wenn ich das richtig sehe, ist das keine Komponente, sondern lediglich eine Klasse. Das ist aber auch kein Beinbruch, da Du sie zur Laufzeit erstellen und dann damit arbeiten kannst. Dazu musst Du nur die entsprechende Unit einbinden.


achsoo.

aber im lib verzeichnis bzw. suchpfad sind die dateien dann schon richitg plaziert?


ich müsste ja einfach nur die unit dem projekt hinzufügen oder?


Zuletzt bearbeitet von oOXTCOo am So 14.06.09 17:31, insgesamt 1-mal bearbeitet
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 14.06.09 17:31 
Sicher, Delphi muss sie ja nur finden können.
oOXTCOo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 141

Windows XP Prof. 3
Delphi 7
BeitragVerfasst: So 14.06.09 17:31 
user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:
Sicher, Delphi muss sie ja nur finden können.


okay danke dann versuche ichs mal so...



EDIT://

KLASSE TPSCConnector NICHT GEFUDNEN...


Zuletzt bearbeitet von oOXTCOo am So 14.06.09 17:35, insgesamt 1-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 14.06.09 17:34 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
uses
  PCSCConnector;

var
  MyConnector: TPCSCConnector;
begin
  MyConnector := TPCSCConnector.Create;
  try
    MyConnector. ...
  finally
    MyConnector.Free;
  end;
Oder du erzeugst das Objekt in OnCreate und gibst es in OnDestroy frei.

Ins Lib-Verzeichnis lege ich normalerweise keine neuen Dateien, es reicht, wenn du den Pfad, in dem die Dateien liegen, dem Bibliothekspfad hinzufügst.
(Altes Delphi: Tools --> Optionen --> Verzeichnisse/Bedingungen --> Bibliothekspfad
Neues Delphi: Tools --> Optionen --> Umgebungsoptionen --> Delphi-Optionen --> Bibliothek - Win32 --> Bibliothekspfad)
oOXTCOo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 141

Windows XP Prof. 3
Delphi 7
BeitragVerfasst: So 14.06.09 17:38 
Moderiert von user profile iconNarses: Komplett-Zitat des letzten Beitrags entfernt.

habe ich auch gerade versucht, kommt die fehler meldung: (bild im anhang)


EDIT://
mit der alten komponente hats so super funtioniert, und jetzt klappt gar nichts mehr :(
Einloggen, um Attachments anzusehen!
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 14.06.09 17:42 
Die Funktion ist in WinSCard deklariert, allerdings nur, wenn WinSCard_DYNLINK definiert ist.
oOXTCOo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 141

Windows XP Prof. 3
Delphi 7
BeitragVerfasst: So 14.06.09 17:47 
user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:
Die Funktion ist in WinSCard deklariert, allerdings nur, wenn WinSCard_DYNLINK definiert ist.

zuerst schreibt er mir das pcscconnector nicht gefunden wurde. dann füge ich es dem projekt bei dann schreibt er mir das schon eine vorhanden ist mit dem namen. ich komme mit dem einfach nicht zurecht...

immer wenn sowas ist wie so speziell komponenten einfügen habe ich diese probleme...


ich versuche es jetzt mal von ganz von vorne. ich erstelle eine neu anwendung, denn vieleicht liegts ja am beispiel programm das zur alten komponente gehört. nun habe ich einen ganz frischen code, da gebe ich unter uses pcscconnector rein.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, PCSCConnector;

type
  TForm1 = class(TForm)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

end.

wo muss nun dieser code rein?
ausblenden Delphi-Quelltext
1:
  TSim = class(TPCSCConnector)					

wenn ichs jezt kompiliere meckert er wenigstens nicht...

das hier hat mir der author der pcscconnector komponente (noobi) gesendet:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
Erstmal uses (...) PCSCConnector;

Dann das Ding benutzen, also erstmal relevante Events mit Pozeduren
versorgen:
  (...)
  TSim = class(TPCSCConnector)   //ich hab' da noch ein paar Sachen
  dazuvererbt, sonst kann man das auch direkt benutzen
  (...)

  Sim := TSim.Create;
  Sim.Debugging          := miWriteTrace.Checked; //für Logausgaben
  Sim.OnCardInserted     := CardInserted; //Karte eingeführt
  Sim.OnCardActive       := CardActive;   //Karte ist aktiv
  Sim.OnCardRemoved      := CardRemoved;  //Karte wurde entfernt
  Sim.OnCardInvalid      := CardInvalid;  //Karte ist ungültig
  Sim.OnReaderWaiting    := CardReaderWaiting; //Leser ist bereit
  Sim.OnReaderListChange := CardReaderListChange; //die Liste der Leser hat sich verändert, braucht man normalerweise nicht
  Sim.OnError            := CardError; //ein Fehler ist aufgetreten
  Sim.OnNodeFound        := CardNodeFound; //das ist Layer3, das wirst Du nicht brauchen
  Sim.OnProgress         := CardProgress; //für längere Lesevorgänge
  Sim.OnLogMessage       := CardLogMessage; //fürs Logging
  Sim.OnCHVNeeded        := CardNeedChv; //wenn die Karte eine PIN braucht

  Dann das hier:
  
  Sim.Init;


  Die Events sind hier:

procedure TfmSimSpy2.CardReaderWaiting(Sender: TObject);
begin
  SetStatusbarRightText('Insert a valid SIM');
end;

procedure TfmSimSpy2.CardInserted(Sender: TObject);
begin
  Sim.Connect;
end;

procedure TfmSimSpy2.CardActive(Sender: TObject);
begin

// Hier gehts jetzt eigentlich los, jetzt kann die Karte verwendet
werden.

end;

procedure TfmSimSpy2.CardInvalid(Sender: TObject);
begin
  SetStatusbarRightText('This card is not supported');
end;

procedure TfmSimSpy2.CardError(Sender: TObject; ErrSource: TErrSource; ErrCode: cardinal);
begin
  Log.Debug('CardError' + ErrSourceToText(ErrSource),'Error','Error Code is ' + Sim.DecodeSCardReturnCode(ErrCode));
end;

procedure TfmSimSpy2.CardRemoved(Sender: TObject);
begin
  Sim.ClearAllFiles;
end;

procedure TfmSimSpy2.CardReaderListChange(Sender: TObject);
var
  i        : integer;
  MenuItem : TMenuitem;
begin
  Sim.Close;
  for i := 0 to mnCardreader.Count-1 do
    mnCardreader.Items[i].Free;
  for i := 0 to Sim.NumReaders-1 do
    begin
    MenuItem           := TMenuitem.Create(mmMenu);
    MenuItem.Caption   := Sim.ReaderList[i];
    MenuItem.OnClick   := CardReaderSelected;
    MenuItem.RadioItem := true;
    if i = 0 then MenuItem.Checked := true
             else MenuItem.Checked := false;
    MenuItem.Tag       := i;
    mnCardreader.Add(MenuItem);
    end;
  Sim.UseReaderNum := 0;  //das hier ist wichtig
  Sim.Open;               //anschliessend das hier
end;

procedure TfmSimSpy2.CardNeedChv(Sender: TObject; NeedChv: TNeededPIN);
var
  ChvValue : string;
begin
  with TfmChvRequest.Create(Self) do
    try
      AskForChv(NeedChv,ChvValue);
    finally
      Free;
    end;
  sbStatusBar.Panels[1].Text := VerifyChv(NeedChv,ChvValue);
end;


Moderiert von user profile iconNarses: Beitragsformatierung überarbeitet.


Zuletzt bearbeitet von oOXTCOo am So 14.06.09 18:02, insgesamt 1-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 14.06.09 18:01 
user profile iconoOXTCOo hat folgendes geschrieben Zum zitierten Posting springen:
wo muss nun dieser code rein?
ausblenden Delphi-Quelltext
1:
  TSim = class(TPCSCConnector)					
Wenn du nur die Standardfunktionen benutzen willst, gar nicht, dann kannst du die Klasse auch direkt verwenden und brauchst keine eigene Klasse davon abzuleiten.
oOXTCOo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 141

Windows XP Prof. 3
Delphi 7
BeitragVerfasst: So 14.06.09 18:05 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Wenn du nur die Standardfunktionen benutzen willst, gar nicht, dann kannst du die Klasse auch direkt verwenden und brauchst keine eigene Klasse davon abzuleiten.

wo müsste ichs einfügen?

was ist damit:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
  Sim := TSim.Create;
  Sim.Debugging          := miWriteTrace.Checked; //für Logausgaben
  Sim.OnCardInserted     := CardInserted; //Karte eingeführt
  Sim.OnCardActive       := CardActive;   //Karte ist aktiv
  Sim.OnCardRemoved      := CardRemoved;  //Karte wurde entfernt
  Sim.OnCardInvalid      := CardInvalid;  //Karte ist ungültig
  Sim.OnReaderWaiting    := CardReaderWaiting; //Leser ist bereit
  Sim.OnReaderListChange := CardReaderListChange; //die Liste der Leser hat sich verändert, braucht man normalerweise nicht
  Sim.OnError            := CardError; //ein Fehler ist aufgetreten
  Sim.OnNodeFound        := CardNodeFound; //das ist Layer3, das wirst Du nicht brauchen
  Sim.OnProgress         := CardProgress; //für längere Lesevorgänge
  Sim.OnLogMessage       := CardLogMessage; //fürs Logging
  Sim.OnCHVNeeded        := CardNeedChv; //wenn die Karte eine PIN braucht
  Sim.Init;

ich bekomme nur fehlermeldungen, nichts klappt...

ich habe von einer anderen compnente ein testprogramm APDU.exe, damit läuft alles, ich kann die karte ansprechen usw. aber mit dieser komonente siehts so aus als würde ichs nie schaffen :(

eigentlich will ich einfach nur die beiden commands verwenden:
> SendPduToCard
> SendCommandToCard

und 37 bytes zur karte senden, diese sollten berechnet werden und das ergebnis brauche ich wieder zurück...

mehr brauche ich gar nicht...

Moderiert von user profile iconNarses: Beitragsformatierung überarbeitet.


Zuletzt bearbeitet von oOXTCOo am So 14.06.09 18:09, insgesamt 1-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 14.06.09 18:07 
user profile iconoOXTCOo hat folgendes geschrieben Zum zitierten Posting springen:
wo müsste ichs einfügen?
Die Klassendeklaration gehört unter type, aber wenn du das nicht weißt, wirst du die Klasse sicher auch erst einmal nicht erweitern wollen, also kannst du dir das sparen...

user profile iconoOXTCOo hat folgendes geschrieben Zum zitierten Posting springen:
ich bekomme nur fehlermeldungen, nichts klappt...
Wenn du TSim benutzt, diese Klasse aber nicht deklariert hast, ist das klar...
Nimm einfach direkt TPCSCConnector.
oOXTCOo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 141

Windows XP Prof. 3
Delphi 7
BeitragVerfasst: So 14.06.09 18:10 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Wenn du TSim benutzt, diese Klasse aber nicht deklariert hast, ist das klar...
Nimm einfach direkt TPCSCConnector.

wie meinst du mit direkt?

tpcsconnector.SendCommandToCard bla bla bla ?

kommt das dabei raus: [Fehler] Unit1.pas(32): Undefinierter Bezeichner: 'SendCommandToCard'

aber SendCommandToCard ist in tpcscconnector.pas drinnen!

ahh, aber so sehe ich wenigestens die vorschläge von delphi. wenn ich also pcscconnector. einge, kommen jetzt wenigsens die vorschläge. das hat vorher nicht geklappt...

wie kann ich jetzt zb.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.pcscCardActive(Sender: TObject);
begin
memo1.Lines.Add('OnCardActive');
ShowData;
end;

einfügen?

jetzt habe ich ja keine sichtbare komponente wo ich die ereignisse einstellen kann?

das hier zb. von der alte komonente (test programm) passt ja alles nicht mehr:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.ShowData;
begin
label3.caption := IntToHex(pcscconnector.ReaderState,8);
label4.caption := pcscconnector.AttrICCType;
label5.caption := pcscconnector.AttrVendorName;
label6.caption := pcscconnector.AttrVendorSerial;
label14.caption := IntToHex(pcscconnector.AttrProtocol,8);
end;

ich habe alles mit pcsc. mit pcscconnector. getauscht, aber alles was
dannach steht gibt fehler: undefinierter bezeichner aus...

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

wenn ich zb. versuche den reader port einzustellen (ich weis das er auf 0 eingestellt ist, daurm will ichs mal direkt versuche)
ausblenden Delphi-Quelltext
1:
TPCSCConnector.UseReaderNum := 0;					

kommt die fehlermeldung: [Fehler] Unit1.pas(91): Methodenbezeichner erwartet

aber in der alten version hat das so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
procedure TForm1.bt_InitClick(Sender: TObject);
begin
pcsc.Init;
pcsc.UseReaderNum := 0;
end;

funktioniert...
Moderiert von user profile iconNarses: Beitragsformatierung überarbeitet.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 14.06.09 18:46 
Du musst halt schauen was da vorhanden ist. Wenn der Bezeichner nicht undefiniert ist, wird UseReaderNum ja irgendwas sein, ich weiß ja nicht was. :nixweiss:
oOXTCOo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 141

Windows XP Prof. 3
Delphi 7
BeitragVerfasst: So 14.06.09 19:07 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Du musst halt schauen was da vorhanden ist. Wenn der Bezeichner nicht undefiniert ist, wird UseReaderNum ja irgendwas sein, ich weiß ja nicht was. :nixweiss:

in der unit pcscconnector ist ja folgendes vorhanden:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
function TPCSCConnector.Connect: boolean;
begin
  if FConnected then Disconnect;
  if FUseReaderNum > NOREADERSELECTED then
    if ConnectSelectedReader then FConnected := true
                             else FConnected := false;
  Result := FConnected;
end;

das problem ist, das ich noch nie weitere units verwendet habe und mich gar nicht auskenne wir das funktioniert. aber irgendwie muss ichs hin bekommen, sonst habe ich alles bisher umsonst gemacht :(

ich dachte ich brauche einfach nur eine smartcard komponente ein example und ich sehe schon wie das funktioniert. wäre auch so gewesen wenn die neue komponente auch so funktionieren würde wir die erste. als sichbare komonente...

aber da funktioniert gar nichts. alles was ich aus dem example von der alten komponente nehmen möchte funktioniert in der neuen nicht mehr. ich komme ja nichteinmal soweit das ich den reader am usb port anschließe und suche oder connecte...

soweit wäre nicht schlecht wenn ich schon wäre, aber nix gar nix, es läuft gar nix :(

Moderiert von user profile iconNarses: Beitragsformatierung überarbeitet.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 14.06.09 19:34 
user profile iconoOXTCOo hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
TPCSCConnector.UseReaderNum := 0;					
aber in der alten version hat das so:
ausblenden Delphi-Quelltext
1:
pcsc.UseReaderNum := 0;					
funktioniert...
So funktionierts ja auch...
Aber im ersten Fall greifst du nicht auf eine Instanz der Klasse, sondern auf die Klasse zu... das geht natürlich nicht.
oOXTCOo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 141

Windows XP Prof. 3
Delphi 7
BeitragVerfasst: Do 18.06.09 13:22 
SOOOO.... habs jetzt mit der hilfe von noobi geschafft ;)

das ist der source der funktioniert (sollte jemand das selbe problem haben:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
unit PCSCDemoUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, PCSCConnector, GsmHelper, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    mmEvents: TMemo;
    Button2: TButton;
    Button3: TButton;
    Edit1: TEdit;
    Button4: TButton;
    Button5: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
  private
    procedure CardActive(Sender: TObject);
    procedure CardInvalid(Sender: TObject);
    procedure CardReaderWaiting(Sender: TObject);
    procedure CardError(Sender: TObject; ErrSource: TErrSource; ErrCode: cardinal);
    procedure CardRemoved(Sender: TObject);
    procedure CardReaderListChange(Sender: TObject);
    procedure CardInserted(Sender: TObject);
    procedure CardProgress(Sender: TObject; Accessed: string; RecNo: integer);
    procedure CardLogMessage(Sender: TObject; Location,Status,Data: string);
    procedure CardNeedChv(Sender: TObject; NeedChv: TNeededPIN);
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  PCSCLink : TPCSCConnector;

const

  DFmaster      = $3F00;
//  DFmaster      = $FF10;
  EFiccid       = $2FE2;

implementation

{$R *.dfm}


const

HexChars    = '0123456789abcdefABCDEF';

function Hex2Bin(input: string): string;
var
hex, output: string;
loop       : integer;
begin
     for loop := 1 to Length(input) do if Pos(input[loop], hexchars) > 0 then hex := hex + AnsiUpperCase(input[loop]);
     loop := 1;
     if Length(hex) > 0 then
        repeat
        output := output + Chr(StrToInt('$'+Copy(hex,loop,2)));
        loop := loop + 2;
        until loop > Length(hex);
     Result := output;
end;

function Bin2HexExt(const input:stringconst spaces, upcase: boolean): string;
var
   loop      : integer;
   hexresult : string;
begin
     hexresult := '';
     for loop := 1 to Length(input) do
        begin
        hexresult := hexresult + IntToHex(Ord(input[loop]),2);
        if spaces then hexresult := hexresult + ' ';
        end;
     if upcase then result := AnsiUpperCase(hexresult)
               else result := AnsiLowerCase(hexresult);
end;


function ErrSourceToText(const From: TErrSource): string;
begin
  case From of
    esInit      : Result := 'Init';
    esConnect   : Result := 'Connect';
    esGetStatus : Result := 'GetStatus';
    esTransmit  : Result := 'Transmit';
    else          Result := 'Unkown';
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  PCSCLink.Close;
  PCSCLink.Init;
end;

procedure TForm1.CardReaderWaiting(Sender: TObject);
begin
  mmEvents.Lines.Add('OnReaderWaiting');
end;

procedure TForm1.CardInserted(Sender: TObject);
begin
  mmEvents.Lines.Add('OnCardInserted');
  mmEvents.Lines.Add('  executing Connect : ' + BoolToStr(PCSCLink.Connect,True));
end;

procedure TForm1.CardActive(Sender: TObject);
begin

  mmEvents.Lines.Add('OnCardActive');
end;

procedure TForm1.CardInvalid(Sender: TObject);
begin
  mmEvents.Lines.Add('OnCardInvalid');
end;

procedure TForm1.CardError(Sender: TObject; ErrSource: TErrSource; ErrCode: cardinal);
begin
  mmEvents.Lines.Add('OnCardError');
  mmEvents.Lines.Add('    ' + ErrSourceToText(ErrSource));
  mmEvents.Lines.Add('    ' + PCSCLink.DecodeSCardReturnCode(ErrCode));
end;

procedure TForm1.CardRemoved(Sender: TObject);
begin
  mmEvents.Lines.Add('OnCardRemoved');
end;

procedure TForm1.CardReaderListChange(Sender: TObject);
var
  i        : integer;
begin
  mmEvents.Lines.Add('OnCardReaderListChange');
  PCSCLink.Close;
  for i := 0 to PCSCLink.NumReaders - 1 do
    begin
    mmEvents.Lines.Add('    Reader' + IntToStr(i) + ' : ' + PCSCLink.ReaderList[i]);
    end;
  PCSCLink.UseReaderNum := 0;
  PCSCLink.Open;
end;

procedure TForm1.CardProgress(Sender: TObject; Accessed: string; RecNo: integer);
begin
  mmEvents.Lines.Add('OnCardProgress');
  Application.ProcessMessages;
end;

procedure TForm1.CardLogMessage(Sender: TObject; Location,Status,Data: string);
begin
  mmEvents.Lines.Add('OnCardLogMessage');
  mmEvents.Lines.Add('    ' + Location);
  mmEvents.Lines.Add('    ' + Status);
  mmEvents.Lines.Add('    ' + Data);
end;

procedure TForm1.CardNeedChv(Sender: TObject; NeedChv: TNeededPIN);
var
  ChvValue : string;
begin
  case NeedChv of
    npPIN1 : ChvValue := 'PIN1';
    npPIN2 : ChvValue := 'PIN2';
    npPUK1 : ChvValue := 'PUK1';
    npPUK2 : ChvValue := 'PUK2';
    npUPIN : ChvValue := 'UPIN';
    end;
  mmEvents.Lines.Add('OnCardNeedCHV : ' + ChvValue);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  PCSCLink                    := TPCSCConnector.Create;

  PCSCLink.Debugging          := true;
  PCSCLink.OnCardInserted     := CardInserted;
  PCSCLink.OnCardActive       := CardActive;
  PCSCLink.OnCardRemoved      := CardRemoved;
  PCSCLink.OnCardInvalid      := CardInvalid;
  PCSCLink.OnReaderWaiting    := CardReaderWaiting;
  PCSCLink.OnReaderListChange := CardReaderListChange;
  PCSCLink.OnError            := CardError;
  PCSCLink.OnProgress         := CardProgress;
  PCSCLink.OnLogMessage       := CardLogMessage;
  PCSCLink.OnCHVNeeded        := CardNeedChv;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  StatusBytes : string;
  StatusWord  : word;
  Data: string;
begin
  StatusWord := PCSCLink.CardChangeDir(WordToBytes(DFmaster),StatusBytes);
  mmEvents.Lines.Add('Called CardChangeDir to DFmaster');
  mmEvents.Lines.Add('    ' + PCSCLink.DecodeResponseCode(StatusWord));

  StatusWord := PCSCLink.CardReadFile(WordToBytes(EFiccid),StatusBytes,Data);
  mmEvents.Lines.Add('Called CardReadFile EFiccid');
  mmEvents.Lines.Add('    ' + PCSCLink.DecodeResponseCode(StatusWord));
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  PCSCLink.Free;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin

//SendPduToCard

mmevents.Lines.add(Bin2HexExt(pcsclink.SendPDUToCard(Hex2Bin(edit1.text)), true, true));

//> SendPduToCard
//> SendCommandToCard

end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  // pcsclink.SendPDUToCard(Hex2Bin(edit1.text));

//  pcsclink.Disconnect;

//  BoolToStr(PCSCLink.Connect,True);

  PCSCLink.Close;
  PCSCLink.Init;
pcsclink.UseReaderNum:=1;
 // pcsclink.Open;
  pcsclink.Connect;

mmevents.Lines.add(Bin2HexExt(pcsclink.SendPDUToCard(Hex2Bin(' 00 A4 04 00 10 6E 6F 6B 69 61 2E 73 63 2E 73 75 70 65 72 64 70')), true, true));

end;

procedure TForm1.Button5Click(Sender: TObject);
 var
  StatusBytes : string;
  StatusWord  : word;
  Data: string;
begin
mmevents.Lines.add(Bin2HexExt(pcsclink.SendPDUToCard(Hex2Bin('90 12 00 00 25006841137B3A439D083EA660C7B3DF9AD70880010C028D0158BF130FFBD0A80F1A5DED159')), true, true));

 // SENDING 24 BYTE FROM PHONE TO CALCULATE PER SX4 TO SMARTCARD
 // 90 12 00 0025006841137B3A439D083EA660C7B3DF9AD70880010C028D0158BF130FFBD0A80F1A5DED159

//  mmEvents.Lines.Add('GET RESPONSE: ' + PCSCLink.DecodeResponseCode(StatusWord));
// mmEvents.Lines.Add('GET RESPONSE: ' + PCSCLink.DecodeSCardReturnCode(StatusWord));


end;

end.

nun bekomme ich das als antwort zurück nachdem ich die 24 bytes zur berechnung an die smartcard sende:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
    Reader2 : FT SCR2000 1
OnCardLogMessage
    SendPduToCard
    StartSend
    SELECT FILE    00A40400106E6F6B69612E73632E73757065726470
OnCardLogMessage
    SendPduToCard
    Result
    Normal ending of the command
90 00 
OnCardLogMessage
    SendPduToCard
    StartSend
    UNKNOWN COMMAND9012000025006841137B3A439D083EA660C7B3DF9AD70880010C028D0158BF130FFBD0A80F1A5DED1509
OnCardLogMessage
    SendPduToCard
    Result
    24 bytes of data available via GET RESPONSE
61 18

und jetzt fehlt mir nur noch ein letztes (SEHR WICHTIGES) detail ;)

wie komme ich jetzt an die berechneten 24 bytes?
das steht: 24 bytes of data available via GET RESPONSE

aber ich finde keine funktion oder sonst was für "GET RESPONSE"


grüße
hari

Moderiert von user profile iconNarses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt, Code-Tags hinzugefügt.


Zuletzt bearbeitet von oOXTCOo am Do 18.06.09 13:42, insgesamt 1-mal bearbeitet
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 18.06.09 13:32 
Ich würde mir die letzten beiden auskommentierten Zeilen noch einmal anschauen.
oOXTCOo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 141

Windows XP Prof. 3
Delphi 7
BeitragVerfasst: Do 18.06.09 13:38 
user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:
Ich würde mir die letzten beiden auskommentierten Zeilen noch einmal anschauen.

so habe ich versucht an die daten zu kommen, klappt aber nicht...
es soll auch nichts decodiert werden, ich will ja die daten so weiter verwenden wie sie von der karte kommen...

soo sollte es gehen (testweise daten einfach nur in memo schreiben):
ausblenden Delphi-Quelltext
1:
mmevents.lines.add(pcsclink.SendCommandToCard('9012000025006841137B3A439D083EA660C7B3DF9AD70880010C028D0158BF130FFBD0A80F1A5DED159', Data, status));					

doch ich bekomme einen fehler von delphi...

Moderiert von user profile iconNarses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 18.06.09 14:01 
Hast Du es denn einmal mit den div. CardReadXXX-Methoden versucht?