Неизвестный читатель в SCardGetStatusChange Winscard
Я новичок в.net и хотел бы определить, была ли карта обнаружена или удалена с помощью SCardGetStatusChange от winscard. Но он возвращает retcode = -2146435063, который при преобразовании в Hex даст мне 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
1 ответ
Для будущего исследователя / разработчика.
В 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.
Надеюсь, это поможет.