Seriennummern aller IO-Warrior unter VB6.0 auslesen

Dies ist das deutsche Forum für alle Themen um den IO-Warrior. Beiträge bitte nur in Deutsch.

Moderator: Guido Körber

Post Reply
schlizbaeda
Posts: 2
Joined: Mon Jun 26, 2006 1:44 pm
Location: Großkarolinenfeld
Contact:

Seriennummern aller IO-Warrior unter VB6.0 auslesen

Post by schlizbaeda »

Hallo zusammen,

ich möchte in Visual Basic 6.0 unter Zuhilfenahme der iowkit.dll für eine eindeutige Zuordnung die Seriennummern aller am USB-Port angeschlossenen IO-Warrior-Bausteine auslesen. Dazu habe ich in mein VB6.0-Projekt das Modul iow.bas von CodeMercenaries eingebunden und greife auf die darin deklarierten DLL-Funktionen zu.

In meinem Code ermittle ich mit IowKitGetNumDevs() zuerst die Anzahl der angeschlossenen IO-Warrior-Bausteine. Über eine Schleife ermittle ich dann die Handle-Nummern sowie die Seriennummern der einzelnen Bausteine:

Code: Select all

Sub main()
    Dim s As String
    Dim i As Long, anz As Long, handle As Long
    
    Dim x As Long
    
    Dim buf As String ' Pufferstring für Seriennummer des IO-Warriors
    
    
    handle = IowKitOpenDevice
    anz = IowKitGetNumDevs()
    s = "Anzahl vorhandener IO-Warriors: " & anz & vbNewLine & vbNewLine
    For i = 0 To anz - 1
        handle = IowKitGetDeviceHandle(i + 1)
        s = s & "IOWarrior(" & i & ").Handle = " & handle & vbNewLine
        buf = "01234567890123456789" ' String mit 20 Zeichen vorbelegen
        Debug.Print i; StrPtr(buf);
        x = IowKitGetSerialNumber(handle, StrPtr(buf)) ' Adresse des Puffer
        Debug.Print StrPtr(buf)
        s = s & "IOWarrior(" & i & ").GetSer# = " & x & vbNewLine
        s = s & "IOWarrior(" & i & ").SerialNumber = " & buf & vbNewLine
        
        s = s & vbNewLine
    Next i
    MsgBox s
End Sub
Das Auslesen der Seriennummer mit IowKitGetSerialNumber funktioniert jedoch nicht.

Bei zwei angeschlossenen Bausteinen (Version jeweils V1.0.2.1R) liefert der erste Schleifendurchlauf einen Leerstring, beim zweiten Durchlauf erhalte ich die Laufzeit-Fehlermeldung 14 "nicht genügend Zeichenfolgenspeicher", eine Meldung, die ich bisher noch nie gesehen habe. Da die DLL vermutlich in C++ programmiert wurde, muss als Stringparameter wohl die Adresse der Zeichenkette übergeben werden, die man in VB6.0 über StrPtr herausfindet, oder liege ich hier falsch? Wenn man nur die Variablenbezeichnung "buf" angibt, stürzt die gesamte Entwicklungsumgebung ab.

Die Funktion IowKitGetSerialNumber ist in iow.bas folgendermaßen deklariert:

Code: Select all

Public Declare Function IowKitGetSerialNumber _
    Lib "iowkit" _
    (ByVal iowHandle As Long, ByRef buffer As String) _
As Long

'Public Declare Function IowKitGetSerialNumber _
'    Lib "iowkit" _
'    (ByVal iowHandle As Long, ByRef buffer As Any) _
'As Long

'Public Declare Function IowKitGetSerialNumber _
'    Lib "iowkit" _
'    (ByVal iowHandle As Long, ByRef buffer As Long) _
'As Long
Mit den beiden auskommentierten Varianten habe ich es auch mal versucht, bin aber auf keinen grünen Zweig gekommen.

Hat hier jemand einen Tipp?

Vielen Dank im Voraus,
Peter
schlizbaeda
Posts: 2
Joined: Mon Jun 26, 2006 1:44 pm
Location: Großkarolinenfeld
Contact:

Lösung gefunden

Post by schlizbaeda »

im englischsprachigem Forum gibt's ein Kapitel "iowkit and VB6", in dem eine Lösung präsentiert wird.

Ich habe ursprünglich eine alte Version von iowkit.dll und iow.bas verwendet. In der aktuellen SDK aus dem Download-Bereich wurden die Declare-Functions richtig definiert:

Code: Select all

Public Declare Function IowKitGetProductId _
    Lib "iowkit" _
    (ByVal iowHandle As Long) _
As Long

Public Declare Function IowKitGetSerialNumber _
    Lib "iowkit" _
    (ByVal iowHandle As Long, ByRef serialNumber As Byte) _
As Long
Mein Code sieht jetzt so aus:

Code: Select all

Sub Main()
    Dim s As String
    Dim i As Long, anz As Long, handle As Long
    
    Dim x As Long    ' Returnwert ist Integer (Boolean)
    
    Dim buf(0 To 18) As Byte ' Pufferstring für Seriennummer des IO-Warriors
    Dim bufstr As String ' Puffer in String umwandeln
    
    
    handle = IowKitOpenDevice
    anz = IowKitGetNumDevs()
    s = "Anzahl vorhandener IO-Warriors: " & anz & vbNewLine & vbNewLine
    For i = 0 To anz - 1
        handle = IowKitGetDeviceHandle(i + 1)
        
        s = s & "IOWarrior(" & i & ").Handle = " & handle & vbNewLine
        x = IowKitGetSerialNumber(handle, buf(0)) ' Adresse des Puffer
        
        bufstr = buf ' Byte-Array in String umwandeln
        s = s & "IOWarrior(" & i & ").GetSer# = " & x & vbNewLine
        s = s & "IOWarrior(" & i & ").SerialNumber = " & Left(bufstr, 8) & vbNewLine
        
        IowKitCloseDevice handle ' Gerät schließen (wichtig, sonst stürzt die VB6.0-IDE ab)
        
        
        s = s & vbNewLine
    Next i
    MsgBox s
End Sub
Wichtig ist das Schließen aller IOW-Handles mit IowKitCloseDevice vor dem Beenden des VB-Programms. Die VB6.0-IDE stürzt sonst beim Programmende ab. Wird das Programm ohne die Anweisung IowKitCloseDevice als EXE compiliert, stürzt auch die EXE gelegentlich ab, vor allem wenn während der Anzeige der MsgBox ein IOWarrior vom USB entfernt wird.

schlizbäda
Post Reply