2016-04-06 77 views
0

NFC ACR122Uを購入しました。 デルファイ7にサンプルが付属しています。デルファイNFC ACR122U-A9接続エラー

私はdelphi XE8を使用していて、サンプルを32ビット/ win 8.1にコンパイルしています。

apijとサンプルプロジェクト関数をdelphi Xe8に適応させ、PcharをPAnsiCharに置き換え、CharをAnsiCharに置き換えて正しい変更を行いました。

私は8つのネイティブドライバを使用していますが、メーカーのドライブはありません。

私は、デバイスを初期化して、正しくデバイス名を取得することができます:上記の手順は非常にうまく機能

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; 

。次に、私はデバイスに接続するには、次のコードを使用します。

ここ
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; 

、私はSCardConnectAからエラーを取得しています:「指定されたリーダーの名前が認識されません。」 retcode varは-2146435063です。ここで

は、私はそれを買ったときにDVDからコピーAPIのスニペットコードは、デバイスに送信されます。
/////////////////////////////////////////////////////////////////////////////// 
// 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'; 

は、私は、デバイスをテストするためにmannufacturerサイトからバイナリアプリをダウンロードし、すべてがうまく動作します。しかし、私はそれが私のDelphiアプリケーションで動作する必要があります。

助けてください。

+0

へ 修正は、これらを試してみてください: 'RETCODE:= SCardConnectA(hContext、 PAnsiChar(AnsiStringの(cbReader.Text))、 SCARD_SHARE_SHARED、 SCARD_PROTOCOL_T0またはSCARD_PROTOCOL_T1、 @hCard、 @dwActProtocol);' – Fritzw

+0

非常にうまく動作します。どうもありがとう。 –

+1

@Fritzw、それを答えに展開できますか? – Johan

答えて

1

問題は、cbReader.Text do PAnsiCharからのキャストです。

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

ありがとう、フリッツ –