AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zugriff auf scardsyn.dll

Ein Thema von twein · begonnen am 17. Apr 2009 · letzter Beitrag vom 27. Mai 2016
Antwort Antwort
Benutzerbild von twein
twein

Registriert seit: 2. Jan 2004
Ort: Düsseldorf
49 Beiträge
 
Delphi 10.3 Rio
 
#1

Zugriff auf scardsyn.dll

  Alt 17. Apr 2009, 17:53
Hallo Leute,

ich versuche schon seit Tagen einen DLL-Aufruf zu realisieren.

Die Funktion die ich aufrufen will habe ich aus einem C++-HeaderFile (versucht) zu übersetzen.

<scardcl.h>

OKERR ENTRY SCardCLGetUID(
IN SCARDHANDLE ulHandleCard,
IN OUT PUCHAR pucUID,
IN ULONG ulUIDBufLen,
IN OUT PULONG pulnByteUID);

<scardcl.pas>
...

Delphi-Quellcode:
var
  SCardCLGetUID: function(ulHandleCard: SCARDHANDLE;
                          var pucUID: PUCHAR;
                          ulUIDBufLen: ULONG;
                          var pulnByteUID: PULONG): ULONG stdcall;
...

Mein Problem ist schon die Variable für "pucUID" zu generieen und zu übergeben!

Wer kann helfen????

Besten Dank
Thomas
Angehängte Dateien
Dateityp: h scardcl_175.h (6,3 KB, 12x aufgerufen)
Dateityp: pas scardcl_813.pas (9,4 KB, 23x aufgerufen)
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von nicodex
nicodex

Registriert seit: 2. Jan 2008
Ort: Darmstadt
286 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Zugriff auf scardsyn.dll

  Alt 17. Apr 2009, 18:06
pucUID is die Adresse auf einen Byte-Buffer, dessen Länge wohl in ulUIDBufLen angegeben wird.

Wenn pucUID optional ist, dannfunction SCardCLGetUID(ulHandleCard: SCARDHANDLE; pucUID: Pointer{PByte(Array)}; ulUIDBufLen: ULONG; var pulnByteUID: ULONG): OKERR; cdecl{?}; oderfunction SCardCLGetUID(ulHandleCard: SCARDHANDLE; var pucUID; ulUIDBufLen: ULONG; var pulnByteUID: ULONG): OKERR; cdecl{?};
  Mit Zitat antworten Zitat
Benutzerbild von twein
twein

Registriert seit: 2. Jan 2004
Ort: Düsseldorf
49 Beiträge
 
Delphi 10.3 Rio
 
#3

Re: Zugriff auf scardsyn.dll

  Alt 17. Apr 2009, 20:30
Vielen Dank für die schnelle Antwort.

Aber leider gleiches Problem, vieleicht ist es doch nur die Variablen Declaration/Übergabe.

Denn gerade der Übergabe-Parameter (UID) wird beim Aufruf überschrieben. (Gesehen im Debugger)

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
 OkErr : ULONG;
 dwActiveProtocol : PDWord;
 ATR, UID, ReaderName : String ;
 UIDLen : ULong ;
 ATRLen : Cardinal ;
 hCard : LongInt ;
begin

 ReaderName := CB_SelReader.Text ;
 OkErr := SCardConnectA(hContext, PChar(ReaderName), SCARD_SHARE_SHARED, SCARD_PROTOCOL_T1, hCard, @dwActiveProtocol) ;
 if OkErr = 0 then begin
  ShowMessage('Connect to '+ CB_SelReader.Text ) ;
  fCardConnected := True ;

   UIDLen := 12 ;
   SetLength(UID,12 + 2) ;
   OkErr := SCardCLGetUID(hCard,Pointer(UID),12,UIDLen);
   if OkErr = 0 then begin
    // nächster Schritt
    end;

  OkErr := SCardDisconnect(hCard, SCARD_RESET_CARD) ;
  hCard := 0 ;
  fCardConnected := False ;
   If OkErr = 0 Then ShowMessage('Card has bee disconnected successfully') else ShowMessage('Error is Disconnect!') ;
 end;
end;
Besten Dank
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von nicodex
nicodex

Registriert seit: 2. Jan 2008
Ort: Darmstadt
286 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Zugriff auf scardsyn.dll

  Alt 21. Apr 2009, 09:47
Ich habe mir das SDK von OmniKey mal kurz angesehen...

Du hast die Wahl zwischen:
Delphi-Quellcode:
function SCardCLGetUID(ulHandleCard: SCARDHANDLE; pucUID: PByte; ulUIDBufLen: ULONG; out pulnByteUID: ULONG): TOKErr; stdcall;
function SCardCLGetUID(ulHandleCard: SCARDHANDLE; pucUID: PAnsiChar; ulUIDBufLen: ULONG; out pulnByteUID: ULONG): TOKErr; stdcall;
function SCardCLGetUID(ulHandleCard: SCARDHANDLE; out pucUID; ulUIDBufLen: ULONG; out pulnByteUID: ULONG): TOKErr; stdcall;
Je nachdem, wie du pucUID lesen/verwenden willst.
(OKERR/TOKErr = LongInt und ENTRY = stdcall)

'string' ist in Delphi 2009 ein Unicode-String (zwei Byte pro Zeichen). Du solltest also eher 'AnsiString' verwenden anstatt 'string'.

Wenn du die letzte Variante verwendest (untypisierter Ausgabeparameter), dann sollte die Verwendung so aussehen
Delphi-Quellcode:
UIDLen := 12;
SetLength(UID, UIDLen);
OkErr := SCardCLGetUID(hCard, UID[1], UIDLen, UIDLen);
if OkErr = 0 then
begin
  SetLength(UID, UIDLen);
  //...
end;
  Mit Zitat antworten Zitat
Benutzerbild von twein
twein

Registriert seit: 2. Jan 2004
Ort: Düsseldorf
49 Beiträge
 
Delphi 10.3 Rio
 
#5

Re: Zugriff auf scardsyn.dll

  Alt 27. Apr 2009, 15:09
Hi,

vielen, vielen Dank für Deine fixe Antwort. (Sorry für meine lahme Antwort, war 4 Tage Ski fahren)

Ich hatte das Problem schon gelöst, gefällt mir aber nicht so gut:

Habe die betreffende Funktion in der ScardCL.pas verändert:
Delphi-Quellcode:
var
  SCardCLGetUID: function(ulHandleCard: SCARDHANDLE;
                          var pucUID ;
                          ulUIDBufLen: ULONG;
                          var pulnByteUID: ULONG) : ULONG; stdcall;
Delphi-Quellcode:
var
 OkErr : ULONG;
 dwActiveProtocol : PDWord;
 UID, ReaderName : String ;
 UID_Reader:array[0..12]of CHAR;
 UIDLen : ULong ;
 hCard : LongInt ;

begin
 ....
   UIDLen := 12 ;
   OkErr := SCardCLGetUID(hCard,UID_Reader,UIDLen,UIDLen);

Wie soll ich denn folgendes verstehen?
Zitat:
Je nachdem, wie du pucUID lesen/verwenden willst.
(OKERR/TOKErr = LongInt und ENTRY = stdcall)
Mit bestem Gruß
Thomas
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von nicodex
nicodex

Registriert seit: 2. Jan 2008
Ort: Darmstadt
286 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Zugriff auf scardsyn.dll

  Alt 27. Apr 2009, 15:17
Zitat von twein:
Wie soll ich denn folgendes verstehen?
Zitat:
Je nachdem, wie du pucUID lesen/verwenden willst.
(OKERR/TOKErr = LongInt und ENTRY = stdcall)
Man kann die API auf verschiedene Arten nach Delphi portieren.
So wie du es getan hast (untypisierter, erforderlicher Parameter) oder als optionalen Zeiger (x: Poiner). Das hängt aber von der API ab und wie man sie verwenden soll/darf.
Ich finde die C-Definitionen der API bereits schlecht (IN OUT und das obwohl es nur OUT ist, u.s.w).

Kurz: Es spricht nichts gegen deine Übersetzung.
  Mit Zitat antworten Zitat
Benutzerbild von twein
twein

Registriert seit: 2. Jan 2004
Ort: Düsseldorf
49 Beiträge
 
Delphi 10.3 Rio
 
#7

Re: Zugriff auf scardsyn.dll

  Alt 27. Apr 2009, 15:49
Hi,

nochmals Danke!

Ein ähnliches Problem habe mit der Statusabfrage eines Kartenlesegerätes "SCardGetAttrib" aus der "WinSCard.pas".

Hier der Visual-Basic Aufruf:
[visualbasic]
ATRLen = 64
OkErr = SCardGetAttrib(hCard, SCARD_ATTR_ATR_STRING, ATR(LBound(ATR)), ATRLen)
[/visualbasic]

Ich habe es wie folgt übersetzt!

Delphi-Quellcode:
var
 OkErr : ULONG;
 dwActiveProtocol : PDWord;
 UID, ReaderName : String ;
 UID_Reader:array[0..12]of CHAR;
 UIDLen : ULong ;
 ATR_Reader:array[0..64]of CHAR;
 ATRLen : LongInt ;
begin
 ....
  ATRLen := 64 ;
  OkErr := SCardGetAttrib(hCard, SCARD_ATTR_ATR_STRING, ATR_Reader, ATRLen) ;
 ....
Oh sorry, dies ist doch kein Problem, es funktioniert!!!!
Angehängte Dateien
Dateityp: pas winscard_562.pas (66,8 KB, 42x aufgerufen)
Thomas
  Mit Zitat antworten Zitat
Tazidus

Registriert seit: 29. Mär 2005
Ort: Hilchenbach
44 Beiträge
 
#8

AW: Zugriff auf scardsyn.dll

  Alt 27. Mai 2016, 17:28
Hallo,

es ist etwas her, aber ich hoffe, dass doch noch einer hier liest.

Ich würde gerne mal wissen, wie die WinSCard.dll eingebunden wurde
und wie das Ergebnis von SCardGetAttrib ausgewertet wurde.

Irgendwie habe ich Probleme mit der Umsetzung.

In der Demo-Anwendung, die ich habe (in C++) steht folgendes:

UCHAR rgucATR[SCARD_ATR_LENGTH] = {0};
DWORD dwAtrLen = sizeof(rgucATR);
lResult = SCardGetAttrib(hCard,SCARD_ATTR_ATR_STRING,rgucATR ,&dwAtrLen);

lResult ist vom Typ LONG

Laut Microsoft ist

LONG WINAPI SCardGetAttrib(
_In_ SCARDHANDLE hCard,
_In_ DWORD dwAttrId,
_Out_ LPBYTE pbAttr,
_Inout_ LPDWORD pcbAttrLen
);

Also habe ich diese wie folgt eingebunden:

function SCardGetAttrib(hCard: LongInt; dwAttrId: DWORD; pbAttr: PByte; pcbAttrLen: DWORD): ULONG; stdcall; external 'WinSCard.dll';


Wie bekomme ich nun aus dem Wert "pbAttr" einen (sage ich mal) String.

???

Wer kann helfen.

Ich habe schon gegoogelt und gesehen, dass die Firma Advanced Card Systems Holdings Limited ein SDK und Beispiel-Code für Delphi zur Verfügung stellt. Kenn einer diesen?


Kurz gesagt, ich versuche aus einer ec-Karte die Kontodaten auszulesen.
Wer kann helfen?
Es gibt nichts Gutes, außer man tut es!
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Zugriff auf scardsyn.dll

  Alt 27. Mai 2016, 18:19
Hallo,

var
P: PChar; // PAnsiChar, PWideChar ?
S: AnsiString;
begin
P := PChar(pbAttr);
S := StrPas(P);

Denke an die Längenbegrenzung (die Länge ist ja vorhanden)


Heiko
Heiko
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Zugriff auf scardsyn.dll

  Alt 27. Mai 2016, 21:18
Wenn s vom Typ AnsiString ist, dann konsequent auch PAnsiChar verwenden.
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:04 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