0

マイ プロジェクトの構造

 myApp 
  -->WCFSerLibrary 
  -->ClassLib1
  -->ClassLib2  // This one uses winscard.dll 

付属のスマートカードリーダーと通信したかった。

そのために私が従う4つのステップは

  1. SCardEstablishContext
  2. SCardListReaders を介してリーダー名を取得する
  3. Sカードコネクト
  4. SCardTransmit で読み取る

最初の 3 つのステップは正常に実行されますが、SCardTransmit を実行しようとすると、応答コード87が返されます。

第二に、上記のシナリオは、WCF サービスから呼び出す場合です。現在、Windows FOrm アプリケーションで同じ ClassLib2 を使用しており、適切に通信しています。

 retCode =  ModWinsCard.SCardTransmit(hCard, ref pioSendRequest, ref SendBuff[0], sendLen, ref pioSendRequest, ref RecvBuff[0], ref recvLen);

ModWinsCard クラスの場合

   [DllImport("winscard.dll"l)]
    public static extern Int64 SCardTransmit(UInt64 hCard, ref SCARD_IO_REQUEST pioSendRequest, ref byte SendBuff, int SendBuffLen, ref SCARD_IO_REQUEST pioRecvRequest, ref byte RecvBuff, ref int RecvBuffLen);
4

1 に答える 1

1

87 は無効なパラメータです。このメソッドは long ではなく int を返します。また、入力バッファと出力バッファの最初のアイテムのみを渡しています。カード ハンドルには IntPtr を使用する必要があります。

LONG WINAPI SCardTransmit(
  _In_         SCARDHANDLE hCard,
  _In_         LPCSCARD_IO_REQUEST pioSendPci,
  _In_         LPCBYTE pbSendBuffer,
  _In_         DWORD cbSendLength,
  _Inout_opt_  LPSCARD_IO_REQUEST pioRecvPci,
  _Out_        LPBYTE pbRecvBuffer,
  _Inout_      LPDWORD pcbRecvLength
);

代わりに、以下の pinvoke 署名を試してみませんか?

[DllImport("winscard.dll"l)]
        public static extern int SCardTransmit(
            IntPtr hCard, 
            ref SCARD_IO_REQUEST pioSendRequest, 
            byte[] SendBuff, 
            int SendBuffLen, 
            ref SCARD_IO_REQUEST pioRecvRequest, 
            IntPtr RecvBuff,    // Copy with marshal.copy to a managed array after call.
            ref int RecvBuffLen);
于 2012-10-31T06:35:30.750 に答える