locked
scardtransmit RRS feed

  • Frage

  • Hallo Hat schon jemand mal mit dieser Funktion etwas von einer Smartcard
    gelesen.
    Ich versuche das schon den ganzen Tag, Daten mit dieser Funktion auszulesen.
    Ich bekomme einen Connect auf meine Karte aber kann dann nichts weiter
    auslesen.
     
    #define SCARD_PCI_T0 (&g_rgSCardT0Pci)
     
    pcSendBuff = chr(0x00)+chr(0xB0)+chr(0x00)+chr(0x00)+chr(0x05)
    cRecvBuff = replicate(chr(0), 256)
    nRecvLen=2
    nResult= 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 als
    Result 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 Karte
    auslesen 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=2
    nResult= 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=2
    nResult= 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
  • 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:32
  • 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.

    Montag, 4. April 2011 19:18
  • 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 von

        SCardStatus(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