-1

我是.net 的新手,我想确定是否使用winscard 的SCardGetStatusChange 检测到或删除了卡。但它返回 retcode = -2146435063,当转换为十六进制时会给我 0x80100009 = SCARD_E_UNKNOWN_READER。我只是基于pinvoke.net的代码

这是我的代码示例

Public Structure SCARDREADER_STATE
    Public szReader As String
    Public pvUserData As IntPtr
    Public dwCurrentState As Integer
    Public dwEventState As Integer
    Public cbAtr As Integer
    Public rgbAtr() As Byte
End Structure

<DllImport(winscarddll, CharSet:=CharSet.Ansi, EntryPoint:="SCardGetStatusChangeA")>
Public Shared Function SCardGetStatusChange(ByVal hContext As IntPtr, ByVal dwTime As Integer, ByRef rgReaderState As SCARDREADER_STATE(), ByVal cReaders As Integer) As Integer
End Function

并以我的形式。

Public Function gAtr(ByVal hContext As IntPtr, ByVal reader As String) As String
    Dim ret As Integer
    Dim rs(0) As WinscardFun.SCARDREADER_STATE
    Console.Write(reader)
    'ReDim rs(0).rgbAtr(0 To 35)
    'rs(0).dwEventState = &H0
    'rs(0).rgbAtr = Nothing
    'rs(0).cbAtr = 0
    rs(0).szReader = reader ' "\\\\?PnP?\\Notification"
    rs(0).dwCurrentState = SCARD_STATE_UNAWARE

    ret = WinscardFun.SCardGetStatusChange(hContext, 100000000, rs, 1)
    Console.Write("Ret=" + ret.ToString + vbCrLf)
    Console.Write("Reader:" + rs(0).szReader + vbCrLf)
    If ret = 0 And rs(0).cbAtr > 0 And rs(0).rgbAtr IsNot Nothing Then
        test = "Success"
    Else
        test = "Fail"
    End If

    Return test
End Function

输出是

Ret=-2146435063 读卡器:ACS ACR1222 3S PICC 读卡器 PICC 0 失败

4

1 回答 1

0

对于未来的研究人员/开发人员。

在 SCardGetStatusChange 中,我只是将 SCardReaderState() 更改为 SCardReader

<DllImport(winscarddll, EntryPoint:="SCardGetStatusChangeA", CharSet:=CharSet.Ansi)>
Public Shared Function SCardGetStatusChange(ByVal hContext As IntPtr, ByVal dwTime As Integer, ByRef rgReaderState As SCARDREADER_STATE, ByVal cReaders As Integer) As Integer
End Function

然后<MarshalAs(UnmanagedType.ByValArray, SizeConst:=36)>在rgbAtr的初始化中添加。

希望这会有所帮助。

于 2017-09-15T09:17:03.763 回答