vb.net中的USB读卡器不起作用 [英] USB Card Reader in vb.net not working
问题描述
公共 Hi, Public HIDModule Module HIDModule 公共 DetectDevice()
Public Sub DetectDevice()
昏暗 HidGuid GUID
Dim HidGuid As GUID
昏暗 DeviceInfoSet 长 Dim DeviceInfoSet As Long 昏暗 结果 长 Dim Result As Long 昏暗 MemberIndex 长 Dim MemberIndex As Long 昏暗 MyDeviceInterfaceData SP_DEVICE_INTERFACE_DATA
Dim MyDeviceInterfaceData As SP_DEVICE_INTERFACE_DATA
昏暗 LastDevice 布尔值 Dim LastDevice As Boolean 昏暗 RequiredSize 长 Dim RequiredSize As Long 昏暗 DumRequiredSize 长 Dim DumRequiredSize As Long 昏暗 MyDeviceInterfaceDetailData SP_DEVICE_INTERFACE_DETAIL_DATA
Dim MyDeviceInterfaceDetailData As SP_DEVICE_INTERFACE_DETAIL_DATA
昏暗 DetailDataBuffer() 字节 Dim DetailDataBuffer() As Byte 昏暗 DevicePathName 字符串 Dim DevicePathName As String 致电 HidD_GetHidGuid(HidGuid)
DeviceInfoSet = SetupDiGetClassDevs(HidGuid,vbNullString,0,(DIGCF_PRESENT Call HidD_GetHidGuid(HidGuid)
DeviceInfoSet = SetupDiGetClassDevs(HidGuid, vbNullString, 0, (DIGCF_PRESENT 或 DIGCF_DEVICEINTERFACE))
Or DIGCF_DEVICEINTERFACE))
如果 DeviceInfoSet = INVALID_HANDLE_VALUE If DeviceInfoSet = INVALID_HANDLE_VALUE Then 退出 Exit Sub 结束 End If LastDevice = LastDevice = 错误 MemberIndex = 0 MemberIndex = 0 要做 MyDeviceInterfaceData.cbSize = Len(MyDeviceInterfaceData) MyDeviceInterfaceData.cbSize = Len(MyDeviceInterfaceData) 结果= SetupDiEnumDeviceInterfaces(DeviceInfoSet,0,HidGuid,MemberIndex,MyDeviceInterfaceData) Result = SetupDiEnumDeviceInterfaces(DeviceInfoSet, 0, HidGuid, MemberIndex, MyDeviceInterfaceData) 如果 结果= 0 If Result = 0 Then LastDevice = LastDevice = 真实 其他 结果= SetupDiGetDeviceInterfaceDetail(DeviceInfoSet,MyDeviceInterfaceData,0,_ Result = SetupDiGetDeviceInterfaceDetail(DeviceInfoSet, MyDeviceInterfaceData, 0, _ 0,RequiredSize,0) 0, RequiredSize, 0) 如果 结果= 0 Err.LastDllError = ERROR_INSUFFICIENT_BUFFER 然后 If Result = 0 And Err.LastDllError = ERROR_INSUFFICIENT_BUFFER Then MyDeviceInterfaceDetailData.cbSize = Len(MyDeviceInterfaceDetailData) MyDeviceInterfaceDetailData.cbSize = Len(MyDeviceInterfaceDetailData) ReDim DetailDataBuffer(RequiredSize)
ReDim DetailDataBuffer(RequiredSize)
致电 RtlMoveMemory(DetailDataBuffer(0),MyDeviceInterfaceDetailData,4)
结果= SetupDiGetDeviceInterfaceDetail(DeviceInfoSet,MyDeviceInterfaceData,_ Call RtlMoveMemory(DetailDataBuffer(0), MyDeviceInterfaceDetailData, 4)
Result = SetupDiGetDeviceInterfaceDetail(DeviceInfoSet, MyDeviceInterfaceData, _ VarPtr(DetailDataBuffer(0)),RequiredSize,_ VarPtr(DetailDataBuffer(0)), RequiredSize, _ DumRequiredSize,0) DumRequiredSize, 0) DevicePathName = DevicePathName = CStr (DetailDataBuffer(0))
DevicePathName = StrConv(DevicePathName,VbStrConv.None) CStr(DetailDataBuffer(0))
DevicePathName = StrConv(DevicePathName, VbStrConv.None) DevicePathName = Right $(DevicePathName,Len(DevicePathName)-4) DevicePathName = Right$(DevicePathName, Len(DevicePathName) - 4) Security.lpSecurityDescriptor = 0 Security.lpSecurityDescriptor = 0 Security.bInheritHandle = Security.bInheritHandle = 真实 Security.nLength = Len(安全性) Security.nLength = Len(Security) HidDevice = CreateFile(DevicePathName,GENERIC_READ HidDevice = CreateFile(DevicePathName, GENERIC_READ 或 GENERIC_WRITE,_
(FILE_SHARE_READ Or GENERIC_WRITE, _
(FILE_SHARE_READ 或 FILE_SHARE_WRITE),安全性,_
OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0) Or FILE_SHARE_WRITE), Security, _
OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0) 如果 HidDevice = INVALID_HANDLE_VALUE If HidDevice = INVALID_HANDLE_VALUE Then HidDevice = CreateFile(DevicePathName,GENERIC_NOACCESS,_ HidDevice = CreateFile(DevicePathName, GENERIC_NOACCESS, _ (FILE_SHARE_READ (FILE_SHARE_READ 或 FILE_SHARE_WRITE),_
安全性,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0) Or FILE_SHARE_WRITE), _
Security, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0) 结束 End If 如果 HidDevice<> INVALID_HANDLE_VALUE 然后 跨度> DeviceAttributes.Size = Len(DeviceAttributes) DeviceAttributes.Size = Len(DeviceAttributes) 如果 HidD_GetAttributes(HidDevice,DeviceAttributes) If HidD_GetAttributes(HidDevice, DeviceAttributes) Then 如果 ((DeviceAttributes.VendorID = IdtVendorID) _
(DeviceAttributes.VendorID = MagTekVendorID) If ((DeviceAttributes.VendorID = IdtVendorID) Or _
(DeviceAttributes.VendorID = MagTekVendorID) 或 _
(DeviceAttributes.VendorID = HpVendorID)) Or _
(DeviceAttributes.VendorID = HpVendorID)) 并且 _
(((DeviceAttributes.ProductID = InsertRdrProdID) And _
((DeviceAttributes.ProductID = InsertRdrProdID) 或 _
(DeviceAttributes.ProductID = InsertRdrProdMagID) Or _
(DeviceAttributes.ProductID = InsertRdrProdMagID) 或 _
(DeviceAttributes.ProductID = InsertRdrProdID2) Or _
(DeviceAttributes.ProductID = InsertRdrProdID2) 或 _
(DeviceAttributes.ProductID = MagTekProductID) Or _
(DeviceAttributes.ProductID = MagTekProductID) 或 _
(DeviceAttributes.ProductID = MagTekProductID2) Or _
(DeviceAttributes.ProductID = MagTekProductID2) 或 _
(DeviceAttributes.ProductID = HpProductID)) Or _
(DeviceAttributes.ProductID = HpProductID)) 然后 如果 HidD_GetPreparsedData(HidDevice,PreparsedData) If HidD_GetPreparsedData(HidDevice, PreparsedData) Then 结果= HidP_GetCaps(PreparsedData,功能) Result = HidP_GetCaps(PreparsedData, Capabilities) 如果 结果<> HIDP_STATUS_SUCCESS 然后 跨度> CloseDevice() CloseDevice() 结束 End If 其他 CloseDevice() CloseDevice() 结束 End If 其他 CloseDevice() CloseDevice() 结束 End If 其他 CloseDevice() CloseDevice() 结束 End If 结束 End If 结束 End If 结束 End If MemberIndex = MemberIndex + 1 MemberIndex = MemberIndex + 1 循环 (LastDevice = 真实 或 (HidDevice<> INVALID_HANDLE_VALUE)
结果= SetupDiDestroyDeviceInfoList(DeviceInfoSet) Loop Until (LastDevice = True) Or (HidDevice <> INVALID_HANDLE_VALUE)
Result = SetupDiDestroyDeviceInfoList(DeviceInfoSet) 结束 如果 结果= 0 Err.LastDllError = ERROR_INSUFFICIENT_BUFFER 然后 End Sub If Result = 0 And Err.LastDllError = ERROR_INSUFFICIENT_BUFFER Then RtlMoveMemory method.Since the same code works perfectly in vb it should be something related to .net limitation.Please help. 这篇关于vb.net中的USB读卡器不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
我想创建一个可以检测USB读卡器设备的应用程序,当我刷卡时应该可以读取.下面的代码在VB中可以正常工作.但是当我将其转换为vb.net出现了一些问题.下面是代码.如果有人可以帮助我,那将非常好.
I want to create an application that can detect usb card reader device and when i swipe the card it should read.The below code WORKS PERFECTLY IN VB.But when i converted it to vb.net it is showing some problem.Below is the code for that.It would be great if anybody can help me.
然后在
This method is going in an infinite loop and if i remove the condition
then am getting exception in
推荐答案
你好 sa123 ,
如果读卡器支持HID通信使用API,您可以尝试使用HIDLibrary.dll,它是完全托管的代码:
Hello sa123 ,
If your card reader supports HID communication APIs, you may try using the HIDLibrary.dll which is a fully managed code:
http://hidlibrary.codeplex.com/
I tested it and it works fine. You will find sample example for using it with card readers.
I hope it solves your problem.
Cheers