Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   TSmartCard für Delphi 2010 (https://www.delphipraxis.net/160217-tsmartcard-fuer-delphi-2010-a.html)

hoika 3. Mai 2011 08:56

TSmartCard für Delphi 2010
 
Hallo #,

bei der Umstellung eines D7-Programmes habe ich ein Problem.
Das Programm verwendet die Komponente TSmartCard.
Ich habe jetzt die Pas-Quellen (scardcmp.inc) von String auf AnsiString, PChar PAnsiChar geändert.
Trotzdem stürzt das Programm beim Beenden des Forms, welches die TSmartCard verwendet ab.

Es scheint also doch noch Probleme zu geben.

Bei Towotoko finde ich keine D2010 kompatible Version ... ;(

Was nun ?


Schon mal im voraus Danke für Anregungen/Hilfe.


Heiko

Deep-Sea 3. Mai 2011 09:05

AW: TSmartCard für Delphi 2010
 
Und sonst funktioniert alles?!
Ich hab nämlich für D2009 u.a. noch folgende Funktionen angepasst:
Delphi-Quellcode:
function TSmartCard.ComandStr(const Cmd,DataIn: AnsiString): AnsiString;
begin
  if DataIn = '' then
  begin
    SetLength(Result, 255);
    SetLength(Result, Comand(Cmd,nil,0,@Result[1], Length(Result)));
  end else begin
    SetLength(Result, 255);
    SetLength(Result, Comand(Cmd,@DataIn[1],Length(DataIn),@Result[1], Length(Result)));
  end;
end;

function TSmartCard.Comand(const Cmd: AnsiString;
                            DataIn: Pointer; DataInLen: LongInt;
                            DataOut: Pointer; DataOutMax: LongInt
                            ): LongInt;
var R,L,M: LongInt; C: AnsiString;
begin
  try
    Result:=DataOutMax;
    if not FActive then Error('SmartCard component not activated');
    L:=Length(Cmd);
    if L = 0 then
      R:=FSCardComand(FTDevHandle,nil,L,
                      DataIn,DataInLen,DataOut,Result)
    else
      R:=FSCardComand(FTDevHandle,@Cmd[1],L,
                      DataIn,DataInLen,DataOut,Result);
    if R > 0 then begin
      Result:=0;
      C:=cmSystem+cmInfo+cmErrText;
      L:=Length(C);
      M:=0;
      SetLength(FError, 255);
      R:=Length(FError);
      FSCardComand(FTDevHandle,@C[1],L,nil,M,@FError[1],R);
      SetLength(FError, R);
      Error(FError);
    end;
  except
    Result:=0;
    if not (csDesigning in ComponentState) then raise;
  end;
end;
Vergleichs mal mit deinen :-D Aber ob's daran liegt weiß ich natürlich nicht ...

hoika 3. Mai 2011 10:34

AW: TSmartCard für Delphi 2010
 
Hallo,

oh ein Gleichgesinnter.
Habe das jetzt geändert.
Leider funktioniert es immer noch ;(

Beim Beenden schmiert das Formular ab.

Kannst du mir deine Inc-datei mal per PN geben ?

Danke


Heiko

hoika 3. Mai 2011 12:00

AW: TSmartCard für Delphi 2010
 
Hallo,

erledigt !!!
Musste die Komponente neuinstallieren.

1000 Dank ;)


Heiko

hoika 3. Mai 2011 12:29

AW: TSmartCard für Delphi 2010
 
Hallo,

zu früh gefreut ;(
Ist kein Lesegerät angeschlossen,
stürzt das Programm nach dem Form-Beenden ab.
Allerdings nicht in der Debug- sondern nur in der Release-Version.

Ich erzeuge die Komponente jetzt dynamisch und gebe sie erst mal nicht frei ;)


Heiko

Deep-Sea 3. Mai 2011 12:42

AW: TSmartCard für Delphi 2010
 
Mh, ich hatte auch mal ein Problem mit nicht angeschlossenem Kartenleser ... ich glaube das war, weil ich auf DeviceList zugegriffen habe, obwohl Active auf false stand - glaube ich :gruebel:
Vlt. greifst du auch auf etwas zu, was nicht existiert?!

hoika 3. Mai 2011 12:44

AW: TSmartCard für Delphi 2010
 
Hallo,

Das letzte FreeLibrary in SetActive ist der Schuldige.
Das habe ich jetzt ausgeklammert und werde mir das später ansehen.


Heiko

ConnorMcLeod 3. Mai 2011 14:08

AW: TSmartCard für Delphi 2010
 
AFAICR hatte ich vor zwei Jahren dasselbe Problem mit einem ähnlichen Workaround.

schorsch666 8. Mai 2011 18:34

AW: TSmartCard für Delphi 2010
 
Hallo. Ich suche mir seit Wochen schon die Finger wund, weil ich genau das selbe Problem habe. Setze mehrere SCR335 ein und nutzte bisher TSmartCard. Nun setze ich Delphi XE ein und bekomme es nicht gebacken :roll:

Kann mir vielleicht jemand einen Link (oder auch gerne per Mail) posten, wo ich mir mal eine funktionierende Version ziehen kann?

Wäre echt supermega..!

Tks vorab..

Schorsch

schorsch666 8. Mai 2011 19:29

AW: TSmartCard für Delphi 2010
 
Nochmal ich,
ich habe jetzt mal versucht die Kompo umzustellen, wie hier weiter oben beschrieben.

Aber in der function: SetActive - meckert er mir folgende Zeilen an:

if FileSearch(StrPas(@DllFile[1]), ExtractFilePath(ParamStr(0))+'\;'+S+';'+T) <> '' then

(Doppeldeutiger oder überladener Aufruf von "StrPas")
..
Error('Invalid/missing SmartCard library '+StrPas(@DllFile[1])+
' (Error code '+IntToStr(FLibHandle)+')'+#13#10+
'Pls. download latest version at: http://www.towitoko.de');

(Doppeldeutiger oder überladener Aufruf von "StrPas")
..
Error('Invalid SmartCard library '+StrPas(@DllFile[1])+
' (version mismatch)'+#13#10+
'Pls. download latest version at: http://www.towitoko.de');

(Doppeldeutiger oder überladener Aufruf von "StrPas")

Hat da vielleicht jemand ne Idee? Obwohl ne aktuelle, lauffähige Kompo wäre natürlich was ;-)

Tks vorab und schönes Restwochenende..

Schorsch

Deep-Sea 9. Mai 2011 08:42

AW: TSmartCard für Delphi 2010
 
Die DLL-Suche habe ich ebenfalls überarbeitet und überlasse nun LoadLibrary die Arbeit. Aber gut, auch ohne das sollte es ja gehen.
Versuch mal, den Wert vor der Übergabe an StrPas als PAnsiChar zu casten:
Delphi-Quellcode:
StrPas(PAnsiChar(@DllFile[1]))
:-D

ConnorMcLeod 9. Mai 2011 09:27

AW: TSmartCard für Delphi 2010
 
Liste der Anhänge anzeigen (Anzahl: 1)
Habe mal auf meiner Festplatte gekramt und die Datei im Anhang gefunden. Hilft das?
Bei diesem Link gibt es im SDK viele Codebeispiele (leider keine Delphisourcen, aber immerhin etwas).

schorsch666 9. Mai 2011 09:33

AW: TSmartCard für Delphi 2010
 
Hi und Danke erstmal,
habs jetzt kompilieren können. Hab jetzt eine SCARDCMP.INC - aber habe leider keine Ahnung, wie ich das Teil jetzt einbinden muss/zum Laufen bekomme.

Könntest du mir da weiterhelfen?

Wäre super..

Schorsch

schorsch666 9. Mai 2011 09:35

AW: TSmartCard für Delphi 2010
 
Uups - eben erst gesehen, dass da noch was kam. Habe mir mal downgeloadet und schaue es mir direkt mal an.

Supi - Danke erstmal - ich winke wieder..

Schorsch

schorsch666 9. Mai 2011 10:40

AW: TSmartCard für Delphi 2010
 
Hallo nochmal,
ich verzweifle bald :pale:

Ich habe jetzt die Kompo zum Laufen gebracht und ein kleines Testprogramm erstellt. Wenn ich das jetzt starte und dann die Kompo auf active setze kommt "..missing SCARD32.DLL". Ich also die aktuellen Treiber runtergeladen und installiert - alles fehlerfrei. Die DLL stellte er mir jetzt nach Windows\SysWOW64. Fehler kam immernoch. Also ich diese in dem Verz per regsvr32 scard32.dll versucht zu registrieren, doch dann kommt ".. Modul wurde geladen der DllRegisterServer-Eingangspunkt wurde nicht gefunden. Stellen Sie sicher, blabla".

Könnt ihr euch vorstellen woran das liegt?

Danke..

Schorsch

Deep-Sea 9. Mai 2011 10:57

AW: TSmartCard für Delphi 2010
 
Pack mal die DLL in das Verzeichnis, in dem deine Anwendung liegt ...

schorsch666 9. Mai 2011 11:18

AW: TSmartCard für Delphi 2010
 
hab ich gemacht - geht trotzdem nicht :-(

Deep-Sea 9. Mai 2011 12:29

AW: TSmartCard für Delphi 2010
 
Immer noch der gleiche Fehler, dass er die DLL nicht finden kann? Mh, wie gesagt, das mir der Suche nach der DLL habe ich ebenfalls geändert - sicher nicht ohne Grund, aber welcher das war, weiß ich auch nicht mehr.

schorsch666 9. Mai 2011 13:22

AW: TSmartCard für Delphi 2010
 
Nee - klappt immernoch nicht :roll: Vielleicht fällt dir (oder jemand anderem) ja doch nochwas ein.

Wäre super..

Tks trotzdem schonmal..

Schorsch

Deep-Sea 9. Mai 2011 13:34

AW: TSmartCard für Delphi 2010
 
Ja was hast du denn geändert?
Bei mir sieht SetActive so aus, wobei die Konstante DllFile vor meiner Änderung DllFile32 oder so ähnlich hieß:
Delphi-Quellcode:
procedure TSmartCard.SetActive(Value: Boolean);
var
  C,L,I: LongInt;
  S: AnsiString;
begin
  if Value = FActive then exit;
  try  SetCursor (LoadCursor (0, IDC_WAIT));

  if Value then begin
    if FLibHandle > 0 then FreeLibrary(FLibHandle);
    FLibHandle:=2;
    FLibHandle:=LoadLibrary(DllFile);
    if FLibHandle < HINSTANCE_ERROR then
      Error('Invalid/missing SmartCard library '+ DllFile +
            ' (Error code '+IntToStr(FLibHandle)+')'+#13#10+
            'Pls. download latest version at: http://www.towitoko.de');
    {$IFDEF SCARDDIR}
    FSCardComand:=SCardComand;
    {$ELSE}
    @FSCardComand:=GetProcAddress(FLibHandle, 'SCardComand');
    {$ENDIF}
    if not Assigned(FSCardComand) then begin
      FreeLibrary(FLibHandle);
      FLibHandle:=0;
      Error('Invalid SmartCard library '+StrPas(PAnsiChar(@DllFile[1]))+
            ' (version mismatch)'+#13#10+
            'Pls. download latest version at: http://www.towitoko.de');
    end;
    FTDevHandle:=0;
    L:=-1; C:=0;
    S:=cmSystem+cmAddHWndMsg+
       IntToStr(FWindowHandle)+','+IntToStr(TDEVMSG)+#0;
    I:=FSCardComand(L,@S[1],C,nil,C,nil,C);
    if (I > 0) or (L <= 0) then begin
      FreeLibrary(FLibHandle);
      FLibHandle:=0;
      Error('Cannot access SmartCard Server: '+IntToHex(I,4));
    end;
    FTDevHandle:=L;
    FActive:=True;
    GetDeviceList;
    InsertMenuItems;
  end else begin
    try Comand(cmSystem+cmDelHWnd+IntToStr(FWindowHandle),nil,0,nil,0); except end;
    try Comand(cmSystem+cmDestroy,nil,0,nil,0); except end;
    FreeLibrary(FLibHandle);
    FLibHandle:=0;
    FActive:=False;
  end;
  finally Screen.Cursor:=crDefault; end;
end;

schorsch666 9. Mai 2011 14:20

AW: TSmartCard für Delphi 2010
 
Also der Text sieht absolut abders aus als der Meine. Wo bekommst du denn "DllFile" her? Hast du die global definiert?

Hast du denn die Sourcen noch irgendwo auf der Platte rumkreisen und könntest die mir zukommen lassen?

Jedenfalls mach ich gleich Feierabend - mache mich aber später daheim nochmal dran.

Tks nochmal..

Deep-Sea 9. Mai 2011 15:00

AW: TSmartCard für Delphi 2010
 
Absolut anders? Mh, also ein wenig habe ich schon verändert, aber nicht so gravierend. Scheint, als hätten wir verschiedene Versionen.
Ich habe doch gesagt, dass DllFile die Konstante ist, die bei dir DllFile32 oder so ähnlich heißen müsste.
Kann ich machen, musste mir nur mal deine E-Mail-Adresse per PN schicken :wink:

schorsch666 10. Mai 2011 12:28

AW: TSmartCard für Delphi 2010
 
Hallo nochmal,
also ich habe netterweise die geänderten Sourcen von "Deep-Sea" erhalten und hänge schon den ganzen Tag erfolglos dran die Kompo zum Laufen zu bringen :pale:

Ich bekomme die zwar compiliert und auch installiert (Package .. wurde installiert) aber ich sehe einfach keine Kompo auf der Kompo-Leiste :evil:

Vielleicht mache ich ja auch einfach nur etwas falsch?

Ich gehe auf Komponente, Komponente installieren, in ein neues Package, als Unitname wähle ich die scardc32.pas, Weiter, als Name gebe ich TSmartcard ein, Fertig stellen... ratter, ratter.. TSmartcard.bpl wurde installiert - aber ich seh nix. Auch ein Delphi-Neustart bringt nix.

In meinem Delphi 7 ist die auch drin und da wird sie mir auf einem sep. Reiter namens TOWITOKO angezeigt. Gehe ich mit der Maus drüber kommt SmartCard (SCardC32).

Vielleicht mache ich das ja auch nur komplett falsch. Jemand noch ne Idee?

Tks..

Schorsch

Deep-Sea 10. Mai 2011 13:45

AW: TSmartCard für Delphi 2010
 
In neueren Version von Delphi kann man Komponenten ja nur noch in Packages hinzufügen. Und da musst du diese natürlich mittels RegisterComponents registrieren :-D
Z.B. mit Hilfe einer extra Unit im Package:
Delphi-Quellcode:
unit Reg;

interface

procedure Register;

implementation

uses SCardC32;

procedure Register;
begin
  RegisterComponents('TOWITOKO', [TSmartCard]);
end;

end.

schorsch666 10. Mai 2011 15:21

AW: TSmartCard für Delphi 2010
 
Nenn mich ruhig Trollo - aber ich stehe grad dermassen auf dem Schlauch :oops:

"In neueren Versionen von Delphi kann man Komponenten ja nur noch in Packages hinzufügen" - in VCL-Komponente installieren kann ich doch wählen, ob "in ein vorhandenes Package.. oder "in ein neues Package.." - ich muss das schon unter Komponente, Komponente installieren machen?

Ich hatte jetzt nochmal die Kompo so erstellt, wie zuletzt beschrieben. Doch bevor ich dann irgendwas machen kann sagt er ja schon, dass sie installiert wurde. Ich glaube ich liege hier voll daneben. Welche Version setzt du denn ein?

Zum Verständnis: wenn ich doch eine eigene unit habe - muss die mit in die Kompo? (Und da musst du diese natürlich mittels RegisterComponents registrieren z.B. mit Hilfe einer extra Unit im Package). Doch wie wird die denn dann aufgerufen bzw. wer schmeisst denn RegisterComponents an? Oder soll ich diese unit in meine Anwendung einbauen und dann "Register" selbst aufrufen?

Sorry, ich bastel dir die heftigsten Progs aber das hier peil ich einfach nicht..

Tks nochmal für deine Geduld :roll:

Deep-Sea 10. Mai 2011 15:43

AW: TSmartCard für Delphi 2010
 
Hach du verwirrst mich - und dann auch noch bei so was, wo ich selbst gerade so durchblicke :lol:

Die Funktion Register ruft Delphi automatisch beim installieren auf. Du kannst sie auch (inkl. der Vorwärtsdeklaration im interface-Abschnitt) direkt in die SCARDC32.PAS packen. Wenn du dann das Package ... Kompilierst? Erstellst? Aktualisierst? Installierst? ... Naja, irgendwas davon, dann sollte die Komponente installiert sein :-D

Aber: Testen kannst du es ja auch so, indem du eine Instanz einfach zur Laufzeit selbst erzeugst ...

schorsch666 11. Mai 2011 13:25

AW: TSmartCard für Delphi 2010
 
Hi wiedermal,
jetzt ist mir mein Rechner privat abgeraucht, sodass ich das erst die Tage nochmal testen kann - manchmal tut ne Pause ja auch ihr Gutes :wink:

Danke nochmal..

Schorsch

schorsch666 12. Mai 2011 11:40

AW: TSmartCard für Delphi 2010
 
Aaaargs :-( Jetzt habe ich doch tatsächlich die Kompo TOWITOKO drin und freute mich schon, wie ein Schneiderlein. Deine Tipps waren in deiner Source einfach nur auskommentiert ;-)

ABER jetzt kommt: Memory Card support is disabled for SCM Readers. Failed to Load C:\Windows\System32\MCSCM.DLL.

Wie hattest du das denn gemacht bzw. welches BS setzt du denn ein - auch Win7?

Zwar jetzt echt einen Schritt weiter aber.. ..hättest du noch ne Idee?

Tks..

Schorsch

Deep-Sea 12. Mai 2011 12:06

AW: TSmartCard für Delphi 2010
 
Du brauchst halt die MCSCM.DLL von SCM :wink:
Wahrscheinlich als Wrapper zwischen der alten SCard.dll von TOWITOKO und dem angeschlossenen Kartenlesen von SCM?! Ka, ich habe dieses ganze Chipkarten-Gedöns hier auf Arbeit noch nie leiden können :stupid:

schorsch666 12. Mai 2011 12:47

AW: TSmartCard für Delphi 2010
 
Den habe ich ja. Ich habe mittlerweile ALLES von denen, was man nur bekommen kann. Den Wrapper habe ich auch installiert - aber der Fehler kommt nach wie vor. Ich habe mittlerweile so viele .dll-versionen - alle erfolglos probiert.

Jetzt habe ich mal an deren Support gemailt - mal schauen, ob die ne Idee haben.

Mensch, was ne Arbeit - und alles für die Füsse :-( Nen kleinen Trumpf hab ich ja noch - mein gutes, altes Delphi 7 - da müsste es noch laufen. Dann muss ich eben diesen Teil der Anwendung darin tippen und mir den Krempel per Socket schicken. Mal sehen..

Sollte dir noch was einfallen ;-)

Ciao..

Deep-Sea 12. Mai 2011 13:00

AW: TSmartCard für Delphi 2010
 
Liegt die DLL auch im Anwendungsverzeichnis?
Ich weiß, dass es manchmal kontraproduktiv sein kann, den Wrapper (also nicht die MCSCM.DLL, sondern was anderes) zu installieren. Da läufts dann besser bzw. nur, wenn er nicht drauf ist.

Cyberaxx 16. Apr 2013 14:44

AW: TSmartCard für Delphi 2010
 
Hallo ich weiß zwar der der Thread schon ein paar Jahre auf dem Buckel hat aber ich wäre auch gerne an der Komponente interessiert. Zudem wäre es schön zu wissen ob es bei Schorsch666 nun funktioniert.
Vielleicht wäre es auch für andere irgendwann noch einmal interessant so das man die Sourcen hier posten könnte.

Ich setze D2010 ein mit W7x64

Mavarik 17. Apr 2013 10:42

AW: TSmartCard für Delphi 2010
 
[OT]
Hi!

Was macht Ihr mit den "Karten"?

- Signieren?
- Verschlüsseln?
- Krankenkarte lesen?

[/OT]

Grüsse Mavarik

Cyberaxx 17. Apr 2013 13:18

AW: TSmartCard für Delphi 2010
 
Sie sollen zur Identifikation dienen.
Sprich Anmelden und zur Authentifizierung als MasterKey für eine Passwort Datenbank als Beispiel.

Habe hier noch ein halbes Dutzend programmierbare Karten hier liegen und ein uraltes Chipdrive, ca 12 Jahre alt. Dies hat lieder irgendwann seinen Dienst eingestellt.
Es tauchte beim durchwühlen meiner Sachen auf und da entsptand die kleine Idee.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:33 Uhr.

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