0

我的项目结构

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

我想与附加的智能卡阅读器进行通信。

我遵循的四个步骤是

  1. ScardEstablishContext
  2. 通过 SCardListReaders 获取阅读器名称
  3. SCardConnect
  4. 使用 SCardTransmit 读取

前三个步骤成功执行,但是当我尝试执行 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 是无效参数。该方法返回一个不长的 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 回答