Hallo,
Wenn ich das richtig sehe, willst du etwas aus einem USB-Gerät auslesen. Der Weg über das MSCOMM-Control ist sicher der falsche Weg das zu tun, weil USB-Ports keine hardware Ports darstellen, sie sind Plug and Play-Devices (PnP-Services). Aus VB heraus kann man nicht ohne weiteres auf diese Treiber zugreifen, sondern benötigt eine Brücke dazu. Diese Brücke ist WMI. Windows lädt einen Treiber nach, wenn ein USB-Gerät angefügt wird und daher muss man erst sicher sein, dass der für das USB-Gerät typische Treiber auch geladen ist und als Service auch läuft. Ist man da auf dem sicheren Weg ist die Kommunikation mit dem Gerät eigentlich denkbar einfach über die WinAPI (CreateFile(), ReadFile(), WriteFile()-Funktionen).
Alles in allem ist das m.M.n. kein Einsteiger-Thema. Sofern du keine fertigen ActiveX Klassen dafür findest, hier ein Fingerzeig, wie das funktioniert. Zugriff auf USB über WMI:
Option Explicit
Sub PrüfeUSBGerät()
'
' Code vom 23.03.2007 / EtoP, Hansueli Göldi [ohne Gewähr für irgendwas...
' ;-)]
'
Dim strDevName As String
strDevName = InputBox("Geben Sie den Namen (oder einen Teil)" & vbCrLf & _
"des zu suchenden Gerätes an:", "USB Geräte suchen", _
"*ListAllUSBDevices*")
If strDevName = "" Then Exit Sub
If checkUSBDevice(strDevName) Then
MsgBox "Das Gerät ist angeschlossen", vbOKOnly + vbInformation, "USB" & _
"Check"
Else
If strDevName <> "*ListAllUSBDevices*" Then _
MsgBox "Das Gerät ist NICHT angeschlossen", vbOKOnly + _
vbExclamation, "USB Check"
End If
End Sub
Public Function checkUSBDevice(strUSBDeviceName As String) As Boolean
Dim objWMIService As Object
Dim objDevice As Object
Dim objUSBDevice As Object
Dim arrDeviceNames As Variant
Dim colUSBDevices As Variant
Dim colDevices As Variant
Dim strDevicename As String
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colDevices = objWMIService.ExecQuery _
("Select * From Win32_USBControllerDevice")
For Each objDevice In colDevices
arrDeviceNames = Split(Replace(objDevice.Dependent, Chr(34), ""), "=")
strDevicename = arrDeviceNames(1)
Set colUSBDevices = objWMIService.ExecQuery _
("SELECT * From Win32_PnPEntity Where DeviceID = '" & strDevicename _
& "'")
For Each objUSBDevice In colUSBDevices
If strUSBDeviceName = "*ListAllUSBDevices*" Then MsgBox _
objUSBDevice.Description
If InStr(objUSBDevice.Description, strUSBDeviceName) > 0 Then
checkUSBDevice = True
End If
Next
Next
End Functiondas Beispiel stammt aus einem VBA-Forum.
hFile = CreateFile("\\.\" & USBDeviceNAme, ...) dann leitet die Kommunikation ein in dem es ein Handle auf das geöffnete Device zurück gibt. Zur Nutzung der API-Funktionen gibt es hier viele Informationen. |