2016-04-06 41 views
0

Ich habe gerade eine NFC ACR122U gekauft. Es kommt mit Proben zu Delphi 7.NFC ACR122U-A9 Verbindungsfehler mit Delphi

Ich benutze Delphi XE8 und kompiliere das Beispiel zu 32 Bits/Gewinn 8.1.

Ich habe die korrekten Änderungen (glaube ich) vorgenommen, um die API- und Beispielprojektfunktionen an Delphi Xe8 anzupassen, wobei Pchar zu PAnsiChar und Char zu AnsiChar ersetzt wurde, wo es benötigt wurde.

Ich verwende native Win 8 Treiber, kein Hersteller Laufwerk.

kann ich das Gerät initialisieren und die Gerätenamen richtig mit bekommen:

procedure TfrmDevProg.btnInitClick(Sender: TObject); 
var index: integer; 
begin 

    //Establish context 
    retCode := SCardEstablishContext(SCARD_SCOPE_USER, 
            nil, 
            nil, 
            @hContext); 
    if retCode <> SCARD_S_SUCCESS then begin 
    displayout(GetScardErrMsg(retcode),2); 
    Exit; 
    end ; 

    //List PC/SC readers installed in the system 
    BufferLen := MAX_BUFFER_LEN; 
    retCode := SCardListReadersA(hContext, 
           nil, 
           @Buffer, 
           @BufferLen); 
    if retCode <> SCARD_S_SUCCESS then begin 
    DisplayOut(getscarderrmsg(retCode),2); 
    Exit; 
    end; 

    btnInit.Enabled := false; 
    btnConnect.Enabled := true; 

    LoadListToControl(cbReader,@buffer,bufferLen); 
    // Look for ACR128 PICC and make it the default reader in the combobox 
    for index := 0 to cbReader.Items.Count-1 do begin 
    cbReader.ItemIndex := index; 
    if AnsiPos('ACR122U PICC', cbReader.Text) > 0 then 
     Exit; 
    end; 
    cbReader.ItemIndex := 0; 

end; 

Das Verfahren sehr gut oben arbeitet. Als nächstes benutze ich den nächsten Code zu Gerät verbinden:

procedure TfrmDevProg.btnConnectClick(Sender: TObject); 
begin 

    //Connect to reader using a shared connection 
    retCode := SCardConnectA(hContext, 
          PAnsiChar(cbReader.Text), 
          SCARD_SHARE_SHARED, 
          SCARD_PROTOCOL_T0 or SCARD_PROTOCOL_T1, 
          @hCard, 
          @dwActProtocol); 

    if retcode <> SCARD_S_SUCCESS then begin 
    displayout(GetScardErrMsg(retcode),2) 
    end 
    else begin 
    displayout('Successful connection to ' + cbReader.Text, 1) 
    end; 
end; 

Hier bin ich einen Fehler von SCardConnectA bekommen: „Der angegebene Leser Name wird nicht erkannt.“ und die Retode-Var ist: -2146435063.

ist hier ein Snippet-Code des api von DVD kopiert mit dem Gerät gesendet, wenn ich es gekauft:

/////////////////////////////////////////////////////////////////////////////// 
// Imported functions from Winscard.dll (WIN32 API) 
/////////////////////////////////////////////////////////////////////////////// 
Function SCardEstablishContext(dwscope :DWORD; 
           pvReserved1: LPCVOID; 
           pvReserved2: LPCVOID; 
           phContext :LPSCARDCONTEXT):LONG; stdcall; external 'Winscard.dll'; 

Function SCardReleaseContext(hContext:SCARDCONTEXT):LONG; stdcall; external 'Winscard.dll'; 

Function SCardListReadersA(hContext : SCARDCONTEXT; 
          mszGroups:LPCSTR; 
          szReaders:LPSTR; 
          pcchReaders:LPDWORD):LONG; stdcall; external 'Winscard.dll'; 

//Note : ScardConnectA is for non-UNICODE characters which is only one byte. 
//  For UNICODE characters it is SCardConnectW. Special processing is 
//  required for UNICODE. Be careful! 
Function SCardConnectA(hContext : SCARDCONTEXT; 
         szReaders:LPSTR; 
         dwShareMode : DWORD; 
         dwPreferredProtocols : DWORD; 
         phCard : LPSCARDHANDLE; 
         pdwActiveProtocols:LPDWORD):LONG; stdcall; external 'Winscard.dll'; 

heruntergeladen ich eine binäre App von mannufacturer Website das Gerät zu testen und alle funktioniert gut. Aber ich muss es mit meiner Delphi-App arbeiten.

Jede Hilfe, bitte.

+0

diese: 'retCode: = SCardConnectA (hContext, PAnsiChar (Ansistring (cbReader.Text)), SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0 oder SCARD_PROTOCOL_T1, @hCard, @dwActProtocol);' – Fritzw

+0

Es funktioniert sehr gut. Vielen Dank. –

+1

@Fritzw, kannst du das zu einer Antwort erweitern? – Johan

Antwort

1

Das Problem ist die Besetzung von cbReader.Text tun PAnsiChar. fix es

retCode := SCardConnectA(hContext, PAnsiChar(AnsiString(cbReader.Text)), SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0 or SCARD_PROTOCOL_T1, @hCard, @dwActProtocol); 
+0

Danke Herr Fritz –