这是我第一次尝试在C#中或基本上在任何地方使用读卡器。
我在Windows7 64位中使用ACS ACR122U PICC Interface 0
阅读器。
我的第一个问题发生在我尝试使用连接到读取器时
ModWinsCard.SCardConnect(hContext, cbReader.SelectedItem.ToString(), ModWinsCard.SCARD_SHARE_DIRECT, 0, ref hCard, ref Protocol);
它返回错误代码6,但我在谷歌上搜索并通过将项目的平台从Any CPU
更改为X86
来解决它。
就在那之后,我遇到了另一个问题,这次是在控制读者方面。
我尝试过:
_sentBuffer = new byte[]
{
0xFF,
0x00,
0x48,
0x00,
0x00
};
_receivedBuffer = new byte[10];
_receivedBuffer[0] = 0;
_returnCode = ModWinsCard.SCardControl(_hCard, _dwControlCode, ref _sentBuffer[0], _sentBuffer.Length, ref _receivedBuffer[0], _receivedBuffer.Length, ref bytesReturned);
返回的代码是1
,这很奇怪,因为我在文档中找不到它。
真的需要帮忙。
谢谢!
我自己做了一些关于使用SCardControl
的研究,发现我得到了与1
相同的返回值。
我在这里找到了一个错误代码列表,然后列出了以下内容。
">注意一些返回值可能与表示类似情况的现有Windows返回值具有相同的值。有关此处未列出的错误代码的信息,请参阅系统错误代码。">
该文档指出错误代码值1
是ERROR_INVALID_FUNCTION
我知道这个问题很老,但希望它能在未来帮助到别人。
我知道这是一个老话题,但我在Windows 10(x64)上也有同样的问题,只是我使用的是VB6。
我在使用SCardTransmit
等方面做了很多工作,如果上面有卡,我可以控制读/写。但我想在没有卡的情况下控制读卡器(ACR112U)(关闭自动检测/嘟嘟声),这只能使用SCardControl
(据我所知),因为当我连接到Directmode,然后调用我们的SetBuzzerCardDetection来关闭它时,我会得到一个ERROR_BAD_COMMAND
,但当共享和卡时,它可以工作。
即使是来自ACS本身的带有IOCTL_GET_VERSIONS
的示例也给了我返回值ERROR_INVALID_FUNCTION
Dim vcVersion As VERSION_CONTROL
Dim lReturnedLength As Long
m_lResult = SCardControl(m_hCard, _
IOCTL_GET_VERSIONS, _
0, 0, _
vcVersion, 20, _
lReturnedLength)
If m_lResult <> SCARD_S_SUCCESS Then
我正在使用以下
Declare Function SCardControl Lib "WinScard.dll" ( ByVal hCard As Long, ByVal dwControlCode As Long, ByRef lpInBuffer As Any, ByVal lSizeofBuffer As Long, ByRef lpReceiveBuffer As Any, ByVal lpReceiveBufferSize As Long, ByRef lpBytesReturned As Long) As Long
Const IOCTL_CCID_ESCAPE As Long = (&H42000000 + 3500)
'hCard is a valid handle returned by SCardConnect
'lReturn = SCardConnect(hContext, sReader, eShareMode, ePreferredProtocol, hCard, eActiveProtocol)
'With card on reader: eShareMode = SCARD_SHARE_SHARED, ePrefferedProtocol = SCARD_PROTOCOL_Tx
'Without card on reader: eShareMode = SCARD_SHARE_DIRECT, ePrefferedProtocol = SCARD_PROTOCOL_UNDEFINED
Dim abIn() As Byte
Dim abOut() As Byte
Dim lInLength As Long
Dim lOutLength As Long
Dim lReturn As Long
Dim lReturnedLength As Long
'Command for turning off Buzzer output during card detection
lInLength = 5
ReDim abIn(lInLength - 1)
abIn(0) = &HFF
abIn(1) = &H0
abIn(2) = &H52
abIn(3) = &H0
abIn(4) = &H0
lOutLength = 256
ReDim abOut(lOutLength - 1)
lReturn = SCardControlAny(hCard, _
IOCTL_CCID_ESCAPE, _
abIn(0), lInLength, _
abOut(0), lOutLength, _
lReturnedLength)
'with card on reader: lReturn = ERROR_BAD_COMMAND
'without card on reader: lReturn = ERROR_INVALID_FUNCTION
请注意使用Escape,我还将ControlEscapeEnable
添加到注册表中(只是为了它,我在几个地方添加了它)首先,我做的每件事都没有加载一个特殊的驱动程序(除了Windows 10本身已经得到的驱动程序),但由于Samuel Adam的评论,我从ACS网站加载了最新的驱动程序,但没有什么不同。这真的让我疯了,就像WebUSB不再允许它让我疯一样,所以我本可以使用基于网络的版本。
我通过从供应商的网站下载最新的驱动程序,卸载驱动程序CD中包含的驱动程序来解决这个问题。
仍然想知道返回1意味着什么。。