Fragensteller
scardtransmit

Frage
-
Hallo Hat schon jemand mal mit dieser Funktion etwas von einer Smartcardgelesen.Ich versuche das schon den ganzen Tag, Daten mit dieser Funktion auszulesen.Ich bekomme einen Connect auf meine Karte aber kann dann nichts weiterauslesen.#define SCARD_PCI_T0 (&g_rgSCardT0Pci)pcSendBuff = chr(0x00)+chr(0xB0)+chr(0x00)+chr(0x00)+chr(0x05)cRecvBuff = replicate(chr(0), 256)nRecvLen=2nResult= SCardTransmit(;this.pncard,;SCARD_PCI_T0 ,;pcSENDBUFF,;len(pcSENDBUFF),;0,;@cRecvBuff,;@nRecvLen;)Wenn ich SCARD_PCI_T0 durch 0 ersetze kommt kein Fehler mehr, aber alsResult 22. Habe in einem Forum gelesen das bedeutet unbekannter Befehl.W?re toll wenn jemand was wei?.Ich will eigentlich nur unter VFP ein paar Bytes am Anfang der Karteauslesen bzw. auch schreiben.Freitag, 17. Dezember 2010 13:50
Alle Antworten
-
Ohne zu wissen, wie die SCardTransmit Funktion definiert ist wird es schwierig zu helfen. Welche DLL nutzt Du denn überhaupt für das Smartcard Lesegerät?
Entscheidend ist wohl, wie g_rgSCardT0Pci in dem Moment gesetzt ist. Du compilierst i Endeffekt nur
pcSendBuff = chr(0x00)+chr(0xB0)+chr(0x00)+chr(0x00)+chr(0x05)cRecvBuff = replicate(chr(0), 256)nRecvLen=2nResult= SCardTransmit(;this.pncard,;(&g_rgSCardT0Pci) ,;pcSENDBUFF,;len(pcSENDBUFF),;0,;@cRecvBuff,;@nRecvLen;)
Also ist entscheidend, was g_rgSCardT0Pci im Moment des Aufrufs ist.
Außerdem zweifel ich an, daß Makrosubstitution an der Stelle gefragt wäre, sondern nur(g_rgSCardT0Pci) oder g_rgSCardT0Pci.Wenn Du denkst, die Makrosubstitution wird im #Define schon während der Compilierung ausgeführt, irrst Du.
Tschüß, Olaf.Samstag, 18. Dezember 2010 11:05 -
Also ich habe die Definition aus www.news2news.com sieht folgendermaßen aus. Auch die Definiton habe ich von dort.Hier der Programmtext. Cardstatus schreibt mir korrekt den Kartennamen und die ATR Nummer in das Memofeld.Nur mit dem SCardTransmit klappt es einfach nicht. Wie gesagt die Definition von SCARD_PCI_T0 stammt aus news2news, lasse ich das & bzw die KLammern auch weg kommen Fehler, dass die Variable nicht vorhanden ist.************************************************************
declare long SCardTransmit in Winscard;
integer hCard,;
string pioSendPci,;
string pbSendBuffer,;
long cbSendLength,;
integer pioRecvPci,;
string @pbRecvBuffer,;
long @pcbRecvLength
************************************************************
declare long SCardEstablishContext in Winscard;
integer dwScope, integer pvReserved1,;
integer pvReserved2, integer @phContext
************************************************************
declare long SCardStatus in Winscard;
integer hCard,;
string @szReaderName,;
long @pcchReaderLen,;
long @pdwState,;
long @pdwProtocol,;
string @pbAtr,;
long @pcbAtrLen
************************************************************
declare long SCardConnect in Winscard;
integer hContext,;
string szReader,;
long dwShareMode,;
long dwPreferredProtocols,;
integer @phCard,;
long @pdwActiveProtocol
************************************************************
declare long SCardDisconnect in Winscard;
integer hCard,;
long dwDisposition
************************************************************if not this.EstablishContext()
= messagebox("Keine Verbindung Smart Cards Context", 48, "Class Initialization Error")
return .f.
endif
if this.connectreader("Cherry SmartTerminal XX44 0")
this.cardstatus()
if this.pnProtocolId=0
this.readdata()
endif
this.disconnectreader()
else
wait window "Fehler Connectreader"
endif
************************************************************
protected procedure readdata
#define SCARD_PCI_T0 (&g_rgSCardT0Pci)
#define SCARD_PCI_RAW (&g_rgSCardRawPci)
pcSendBuff = chr(0xff)+chr(0xB0)+chr(0x00)+chr(0x00)+chr(0x05)
cRecvBuff = replicate(chr(0), 256)
nRecvLen=256
nresult=-1
nresult= SCardTransmit(;
this.pncard,;
SCARD_PCI_T0 ,;
pcSendBuff,;
len(pcSendBuff),;
0 ,;
@cRecvBuff,;
@nRecvLen;
)
if (nresult=SCARD_S_SUCCESS)
=b_Step()
endif
return
************************************************************
protected procedure cardstatus
private pnWERT
nReaderNamesLen=512
cReaderNames = replicate(chr(0), nReaderNamesLen)
nAttribLen=33
cATR = replicate(chr(0), nAttribLen)
store 0 to nState, nProtocol
nresult = SCardStatus(this.pncard, @cReaderNames,@nReaderNamesLen, @nState, @nProtocol,@cATR, @nAttribLen)
if (nresult=SCARD_S_SUCCESS)
cReaderName = padr(m.cReaderNames,m.nReaderNamesLen-1)
pmTEXT = pmTEXT + cReaderName+chr(13)
cATR = padr(m.cATR, m.nAttribLen)
pcNUM=""
do while len(cATR)<>0
pnWERT=asc(left(cATR,1))
pcNUM = pcNUM + right(transform(pnWERT, "@0"),2)+" "
cATR=right(cATR,len(cATR)-1)
enddo
pmTEXT = pmTEXT + "ATR "+pcNUM + chr(13)
pmTEXT = pmTEXT + "Status "+alltrim(str(nState,14,0))+ chr(13)
pmTEXT = pmTEXT + "Protokoll "+alltrim(str(nProtocol,14,0))+ chr(13)
endif
return
************************************************************
protected procedure connectreader
parameters tcREADER
local nresult, hCard, nProtocolId
store 0 to hCard, nProtocolId
nresult = SCardConnect(this.hContext,tcREADER, SCARD_SHARE_DIRECT,SCARD_PROTOCOL_OPTIMAL,@hCard, @nProtocolId)
this.pncard=hCard
this.pnProtocolId=nProtocolId
return (nresult=0)
************************************************************
protected procedure disconnectreader
SCardDisconnect(this.pncard, SCARD_LEAVE_CARD)
return
************************************************************
protected procedure EstablishContext
this.ReleaseContext()
local nresult, hContext
store 0 to nresult, hContext
nresult = SCardEstablishContext(SCARD_SCOPE_USER,0, 0, @hContext)
this.hContext = m.hContext
return (nresult=0)
************************************************************Bisher habe ich nirgends eine Definition gefunden wie das ganze aussehen muss."Olaf Doschke" <=?utf-8?B?T2xhZiBEb3NjaGtl?=> schrieb im Newsbeitrag news:b5d7d2e6-ee75-4178-9250-d0c84e220407...Ohne zu wissen, wie die SCardTransmit Funktion definiert ist wird es schwierig zu helfen. Welche DLL nutzt Du denn überhaupt für das Smartcard Lesegerät?
Entscheidend ist wohl, wie g_rgSCardT0Pci in dem Moment gesetzt ist. Du compilierst i Endeffekt nur
pcSendBuff = chr(0x00)+chr(0xB0)+chr(0x00)+chr(0x00)+chr(0x05)cRecvBuff = replicate(chr(0), 256)nRecvLen=2nResult= SCardTransmit(;this.pncard,;(&g_rgSCardT0Pci) ,;pcSENDBUFF,;len(pcSENDBUFF),;0,;@cRecvBuff,;@nRecvLen;)
Also ist entscheidend, was g_rgSCardT0Pci im Moment des Aufrufs ist.
Außerdem zweifel ich an, daß Makrosubstitution an der Stelle gefragt wäre, sondern nur(g_rgSCardT0Pci) oder g_rgSCardT0Pci.Wenn Du denkst, die Makrosubstitution wird im #Define schon während der Compilierung ausgeführt, irrst Du.
Tschüß, Olaf.Samstag, 18. Dezember 2010 15:07 -
Ich habe mal das ganze PRG reingepackt. Ich hatte nur den einen Teil rausgezogen."Olaf Doschke" <=?utf-8?B?T2xhZiBEb3NjaGtl?=> schrieb im Newsbeitrag news:716b846f-8a56-42bf-8645-827096a43e1d...
Wäre nett, wenn Du den direkten Link angeben könntest.
Auch dem größeren Codestück fehlt die Definition der Variablen g_rgSCardT0Pci.
Für sich kann das nicht klappen, das muß Teil eines größeren sein.
Tschüß, Olaf.
Samstag, 18. Dezember 2010 15:51 -
So habe ich die Definition gefunden."Olaf Doschke" <=?utf-8?B?T2xhZiBEb3NjaGtl?=> schrieb im Newsbeitrag news:716b846f-8a56-42bf-8645-827096a43e1d...
Wäre nett, wenn Du den direkten Link angeben könntest.
Auch dem größeren Codestück fehlt die Definition der Variablen g_rgSCardT0Pci.
Für sich kann das nicht klappen, das muß Teil eines größeren sein.
Tschüß, Olaf.
Samstag, 18. Dezember 2010 15:55 -
So wie ich das verstanden habe ist das ein Verweis auf eine Struktur in WINSCARD.DLL"Olaf Doschke" <=?utf-8?B?T2xhZiBEb3NjaGtl?=> schrieb im Newsbeitrag news:716b846f-8a56-42bf-8645-827096a43e1d...
Wäre nett, wenn Du den direkten Link angeben könntest.
Auch dem größeren Codestück fehlt die Definition der Variablen g_rgSCardT0Pci.
Für sich kann das nicht klappen, das muß Teil eines größeren sein.
Tschüß, Olaf.
Samstag, 18. Dezember 2010 15:59 -
Ich sehe schon, das ist tatsächlich eine Adresse in der WINSCARD.DLL, an die kommst Du in VFP so nicht heran, VFP interpretiert &name als Makrosubstitution der Variable name, nicht als das, was es in C++ meint, nämlich die Adresse einer Ressource oder gar eine Funktion.
Ich habe keine Ahnung, wie man da heran kommt.
Wie wäre es, Du nimmst das:
http://www.news2news.com/vfp/?solution=2
Oder Du suchst nach einer anderen Smartcard Bibliothek für VFP.
Es ist im Bereich des Möglichen, an den nötigen Wert von g_rgSCardT0Pci heranzukommen. Siehe hier: http://www.pcreview.co.uk/forums/thread-1312171.php
GetProcAddress wäre eine API Funtion, die Eine Adresse für einen Funktionsnamen zurückgibt. Zieht aber einen Rattenschwanz an weiterem hinter sich her.
Tschüß, Olaf.
Samstag, 18. Dezember 2010 16:11 -
Das mit ACOS habe ich auch gesehen. Die schreiben aber das funktioniert mit ACOS Karten.Werde die mal anschreiben ob das auch mit anderen geht.Danke."Olaf Doschke" <=?utf-8?B?T2xhZiBEb3NjaGtl?=> schrieb im Newsbeitrag news:f9e91ec5-7ff3-4f04-bd8b-453776a89f66...
Ich sehe schon, das ist tatsächlich eine Adresse in der WINSCARD.DLL, an die kommst Du in VFP so nicht heran, VFP interpretiert &name als Makrosubstitution der Variable name, nicht als das, was es in C++ meint, nämlich die Adresse einer Ressource oder gar eine Funktion.
Ich habe keine Ahnung, wie man da heran kommt.
Wie wäre es, Du nimmst das:
http://www.news2news.com/vfp/?solution=2
Oder Du suchst nach einer anderen Smartcard Bibliothek für VFP.
Es ist im Bereich des Möglichen, an den nötigen Wert von g_rgSCardT0Pci heranzukommen. Siehe hier: http://www.pcreview.co.uk/forums/thread-1312171.php
GetProcAddress wäre eine API Funtion, die Eine Adresse für einen Funktionsnamen zurückgibt. Zieht aber einen Rattenschwanz an weiterem hinter sich her.
Tschüß, Olaf.
Samstag, 18. Dezember 2010 16:16 -
Habe es zwischenzeitlich gelöst. Wenn das mal jemand braucht einfach melden."waspod" <=?utf-8?B?d2FzcG9k?=> schrieb im Newsbeitrag news:3edc838a-cb18-40a2-a249-74091ce96739...Das mit ACOS habe ich auch gesehen. Die schreiben aber das funktioniert mit ACOS Karten.Werde die mal anschreiben ob das auch mit anderen geht.Danke."Olaf Doschke" <=?utf-8?B?T2xhZiBEb3NjaGtl?=> schrieb im Newsbeitrag news:f9e91ec5-7ff3-4f04-bd8b-453776a89f66...
Ich sehe schon, das ist tatsächlich eine Adresse in der WINSCARD.DLL, an die kommst Du in VFP so nicht heran, VFP interpretiert &name als Makrosubstitution der Variable name, nicht als das, was es in C++ meint, nämlich die Adresse einer Ressource oder gar eine Funktion.
Ich habe keine Ahnung, wie man da heran kommt.
Wie wäre es, Du nimmst das:
http://www.news2news.com/vfp/?solution=2
Oder Du suchst nach einer anderen Smartcard Bibliothek für VFP.
Es ist im Bereich des Möglichen, an den nötigen Wert von g_rgSCardT0Pci heranzukommen. Siehe hier: http://www.pcreview.co.uk/forums/thread-1312171.php
GetProcAddress wäre eine API Funtion, die Eine Adresse für einen Funktionsnamen zurückgibt. Zieht aber einen Rattenschwanz an weiterem hinter sich her.
Tschüß, Olaf.
Montag, 4. April 2011 17:01 -
Habe es zwischenzeitlich gelöst. Wenn das mal jemand braucht einfach melden.
Das ist ein nettes Angebot, Danke. Z.Zt. brauch ich das nicht, aber ein anderer vielleicht?
Tschüß, Olaf.
Hallo, ich möchte eigentlich nur die eineutige ID der Karte auslesen. Dafür habe ich das ganze, so wie unter news2news.com beschrieben versucht. Allerdings habe ich folgendes Problem:
Wenn ich einen Smartcardreader an den USB Port angesteckt habe und sich darin eine Karte befindet, oder auch nicht, bekomme ich vonSCardStatus(this.pncard, @cReaderNames,@nReaderNamesLen, @nState, @nProtocol,@cATR, @nAttribLen)
immer den Wert 6 zurück. Ich habe bereits einige Zeit versucht, das Problem ausfindig zu machen, aber leider die Ursache nicht gefunden. Falls ihr eine Idee habts, wäre ich über eine Antwort sehr dankbar.
LG Stefan
Montag, 6. Juni 2011 13:25