2017-09-15 95 views
-1

我是新來的.NET,我想確定是否使用winscard的SCardGetStatusChange檢測到卡或移除卡。但它返回retcode = -2146435063,當轉換爲十六進制將給我0x80100009 = SCARD_E_UNKNOWN_READER。我只是根據我的代碼pinvoke.netSCardGetStatusChange中的未知閱讀器Winscard

這裏是我的代碼

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 

輸出是

懲戒= -2146435063 讀卡器:ACS ACR1222 3S PICC讀卡器PICC 0 故障

+0

你確定你有讀卡器安裝驅動嗎?您是否曾經通過您的計算機上的其他應用程序工具成功使用您的讀卡器? –

+0

是的,事實上我成功地使用了scardconnect和scardreaderlist。所以我相信讀者工作正常。我只想使用scardgetstatuschange來識別是否檢測到卡。你能提供 – Anonymouse24

+0

的結果嗎 SCardListReaders –

回答

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 

然後在rgbAtr的初始化加入<MarshalAs(UnmanagedType.ByValArray, SizeConst:=36)>

希望這會有所幫助。