Nachdem ich den "Hardwarekrams" jetzt soweit durch habe bin ich auf ein unschönes Verhalten in der dll gestoßen, welches auch schon in dem Artikel http://www.codemercs.de/phpBB2/viewtopi ... wrapheader beschrieben ist.
Ich habe 2 Anwendungen die vollkommen unterschiedliche Aufgaben ausführen sollen. Jede Anwendung hat einen IOW. Da mir die Unterscheidung per Seriennummer viel zu schlecht erscheint (ich protokolliere doch keine Seriennummern...) habe ich dafür jedem IOW ein eeprom spendiert, über den ich den jeweils richtigen erkenne. Das klappt auch einzelnd - aber leider macht die Funktion IowKitCloseDevice Lib "iowkit" (ByVal iowhandle As Long) nicht das was ich erhofft habe ;-) Ich ging davon aus, dass nur der IOW mit dem Handle geschlossen wird. Die Doku schreibt dazu "IowKitCloseDevice() closes all open devices". Das ist sehr ungünstig.
Mein Code (vb6) sieht so aus:
Code: Select all
Public Function Connect_IOW(Optional EEProm_Address As i24C01Address = [A0h-000 (160)], Optional EEPromValue As String = "")
Dim buf(0 To 18) As Byte, iowhandle As Long, usehandle As Long, i As Integer
usehandle = 0
iowhandle = IowKitOpenDevice()
If (iowhandle = 0) Then
RaiseEvent ConnectError([Kein IOW verfuegbar])
exit function
End If
For i = 1 To IowKitGetNumDevs
iowhandle = IowKitGetDeviceHandle(i)
Debug.Print "ProductID: " & IowKitGetProductId(iowhandle)
IowKitGetSerialNumber iowhandle, buf(0)
Debug.Print "SerialNumber: " & CStr(buf)
EnableIIC iowhandle, 1
If ReadOut24C1(iowhandle, EEProm_Address, EEPromValue) Then
If usehandle > 0 Then
RaiseEvent ConnectError([Doppelter IOW]) '2 gleiche Geräte, nur den ersten verwenden
'IowKitCloseDevice (iowhandle) '<- Das klappt nicht
Else
RaiseEvent ConnectToIOW(iowhandle)
usehandle = iowhandle
End If
Else
Debug.Print "Falscher IOW " & iowhandle & "!"
'IowKitCloseDevice (iowhandle) '<- Das klappt nicht
End If
Next
If usehandle = 0 Then RaiseEvent ConnectError([Kein passender IOW]): Exit Function
Debug.Print ReadOut24C1(usehandle, EEProm_Address) 'Ist immer leer, wenn IowKitCloseDevice gerufen wurde
Connect_IOW = myhandle
End Function
Wie gebe ich den, für diese Anwendung falschen, IOW wieder frei?
Gibt es dafür schon eine Lösung?
Gruß
Matthias