none
PC/SC APIについて RRS feed

  • 質問

  • はじめして。


    PC/SCのAPIを使って、ICカードの読み書きを行おうと思っております。

    開発環境 Visual Studio 2005(Visual Basic)

    ICカード JICSAP

    PC/SC対応のリードライター

    winscardのAPIを使って、

    SCardEstablishContext

    SCardListReaders

    SCardConnect

    SCardBeginTransaction

    SCardStatus

    SCardTransmit

    SCardEndTransaction

    SCardDisconnect

    の順でICカードへアクセスしています。

    全てのAPIからの戻り値は0が返ってきます。

    おそらく正常に通信できていると思っているのですが、SCardTransmitで6番目の引数(pbRecvBuffer)に上手く受信ができません。

    7番目の引数(pcbRecvLength)には「2」となります。

    SCardTransmit部分のコードです。

    Dim SendRequest As SCARD_IO_REQUEST
    SendRequest.dwProtocol = lActiveProtocol  ’2が入ります
    SendRequest.cbPciLength = Len(SendRequest)  ’8が入ります

    SCardTransmit(hCard, SendRequest, pbSendBuffer(0), send_len, RecvRequest, pbRecvBuffer(0), pcbRecvLength)

        Public Declare Function SCardTransmit Lib "winscard.dll" ( _
         ByVal hCard As Integer, _
         ByRef pioSendRequest As SCARD_IO_REQUEST, _
         ByRef pbSendBuffer As Byte, _
         ByVal cbSendLength As Integer, _
         ByRef pioRecvRequest As SCARD_IO_REQUEST, _
         ByRef pbRecvBuffer As Byte, _
         ByRef pcbRecvLength As Integer _
     ) As Integer

        Public Structure SCARD_IO_REQUEST
            Public dwProtocol As Integer  
            Public cbPciLength As Integer
        End Structure

    何か良いアドバイスがあれば教えて下さい。

    よろしくお願い致します。

    (初めての投稿ですので、記載内容や方法に失礼があるかも知れませんが、初めてと言う事でお許し頂ければ幸いです。)

    2012年4月12日 0:49

すべての返信

  • とりあえず、Byte配列を ByRef As Byteではなく、<In> ByVal As Byte() / <Out> ByVal As Byte() で記述してみてください。In / Out は、関数に渡す側が In、関数から受け取る側が Out です。渡して且つ受け取る引数があれば <In, Out> ですが今回は関係ないですね。
    2012年4月12日 3:03
  • ご回答ありがとうございます。

    以下のようにしてみましたが、ダメでした。

     Public Declare Function SCardTransmit Lib "winscard.dll" ( _
         ByVal hCard As Integer, _
         ByRef pioSendRequest As SCARD_IO_REQUEST, _
         ByRef pbSendBuffer As Byte(), _
         ByVal cbSendLength As Integer, _
         ByRef pioRecvRequest As SCARD_IO_REQUEST, _
         ByRef pbRecvBuffer As Byte(), _
         ByRef pcbRecvLength As Integer _
     ) As Integer

        Public pbSendBuffer(254) As Byte
        Public pbRecvBuffer(254) As Byte

    SCardTransmit(hCard, SendRequest, pbSendBuffer, send_len, RecvRequest, pbRecvBuffer, pcbRecvLength)


    2012年4月12日 3:30
  • ご回答を正しく読んでないようでした。

    下記のようにしました。結果はpbRecvBufferに受信されませんでした。

     Public Declare Function SCardTransmit Lib "winscard.dll" ( _

         ByVal hCard As Integer, _
         ByRef pioSendRequest As SCARD_IO_REQUEST, _
         ByVal pbSendBuffer As Byte(), _
         ByVal cbSendLength As Integer, _
         ByRef pioRecvRequest As SCARD_IO_REQUEST, _
         ByVal pbRecvBuffer As Byte(), _
         ByRef pcbRecvLength As Integer _
     ) As Integer

        dim pbSendBuffer(254) As Byte
        dim pbRecvBuffer(254) As Byte

    SCardTransmit(hCard, SendRequest, pbSendBuffer, send_len, RecvRequest, pbRecvBuffer, pcbRecvLength)

    2012年4月12日 5:18