2017-09-15 2 views
-1

Ich bin neu bei.net und ich möchte identifizieren, wenn Karte mit SCardGetStatusChange von Winscard erkannt oder entfernt wird. Aber es wird retcode = -2146435063 zurückgegeben, was bei der Konvertierung in Hex 0x80100009 = SCARD_E_UNKNOWN_READER ergibt. Ich meinen Code nur auf Basis von pinvoke.netUnbekannter Leser in SCardGetStatusChange Winscard

Hier Probe meines Codes

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 

Und in meiner Form.

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 

Der Ausgang ist

Ret = -2146435063 Reader: ACS ACR1222 3S PICC Reader PICC 0 Ausfallen

+0

Sind Sie sicher, dass Sie den Treiber für den Kartenleser installiert haben? Haben Sie Ihren Kartenleser jemals erfolgreich über andere App-Tools auf Ihrem Computer verwendet? –

+0

Ja, tatsächlich habe ich scardconnect und scardreaderlist erfolgreich benutzt. Daher bin ich sicher, dass der Leser richtig funktioniert. Ich möchte nur die scardgetstatus ändern, um zu erkennen, ob die Karte erkannt wurde oder nicht. – Anonymouse24

+0

könnten Sie Ergebnis von SCardListReaders –

Antwort

0

Für zukünftige Forscher/developer.

In SCardGetStatusChange, Ich habe gerade die SCardReaderState()

<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 

dann die <MarshalAs(UnmanagedType.ByValArray, SizeConst:=36)> in der Initialisierung von rgbAtr SCardReader hinzugefügt.

hoffen, dass dies hilft.