我的项目结构
myApp
-->WCFSerLibrary
-->ClassLib1
-->ClassLib2 // This one uses winscard.dll
我想与附带的智能卡reaer通信。
我遵循的四个步骤
- scardestablishContext
- 通过scardlistreaders获取读者名称
- scardConnect
- 用scardtransmit阅读
前三个步骤成功执行,但是当我尝试执行scardtransmit时,它会给我回复 87 的响应代码。
第二侧,上述方案是我从WCF服务中调用它的时候。现在,我在Windows表单应用程序中使用了相同的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);
87是无效的参数。该方法返回不长的INT。另外,您仅传递IN和OUT缓冲区中的第一项。应将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);