hallo, gibt es allgemein Probleme mit dem Typ microsoft.win32.SafeFileHandles in Windows? denn wenn ich versuche meine .exe datei in ordner release ausführen bekomme ich win32 error: "error invalid Handle" nach dem befehl "WriteFile" ////WriteFile//// Public Declare Auto Function WriteFile Lib "kernel32.dll" _ (ByVal hFile As SafeFileHandle, _ ByVal lpBuffer As Byte(), ByVal nNumberOfBytesToWrite As Integer, _ ByRef lpNumberOfBytesWritten As Integer, _ ByRef lpOverlapped As IntPtr) As Boolean wenn ich es aber in der IDE ausführe dann läuft alles hervorragend was denn das zu bedeuten? danke für eure Hilfe thanks
Also wenn du das Handle dir von CreateFile "geholt" hast sollte es eigentlich problemlos gehen. Ich weiss ja jetzt nicht was vorher bei dir im Code steht.
das ist also mein code
die methode sendpacket() liefert den error "error invalid handle"
obwohl hdevice von createfile richtig erzeugt wird (habe ich mit
hdevice.isinvalid geprüft)
nach dem ersten aufruf sendpacket(startsessionpacket) bekomme ich die
fehlermeldung
ich verstehe nicht warum! wie gesagt es funktioniert wunderbar in der
IDE aber außerhalb bekomme ich diese Fehlermeldung
Option Strict On
Imports System.Runtime.InteropServices
Public Module DeviceIo
Dim theDevInfo As SafeFileHandle
Dim hDevice As SafeFileHandle
Dim usb_packet_size As Integer
Dim deviceioResult As Boolean
Dim thePacket() As Byte
#Region "Méthodes"
Public Function main() As Boolean
init()
If theDevInfo Is Nothing Then
MsgBox("Kommunikation fehlgeschlagen")
Return False
Else
Dim theProduktPacket() As Byte = New Byte() _
{&H14, &H0, &H0, &H0, &HFE, &H0, &H0, &H0, &H0, &H0, &H0,
&H0}
'send the product packet
SendPacket(theProduktPacket)
'receive the product informations
Do
thePacket = GetPacket()
If thePacket(0) = 20 And thePacket(4) =
BasicPacketIDs.Pid_Product_Data Then Exit Do
Loop
Return True
End If
End Function
Private Function ToPosition(ByVal degree As Double) As Integer
Return CInt(degree * (2 ^ 31) / 180)
End Function
Public Sub init()
Dim thePacket2() As Byte
Dim theStartSessionPacket() As Byte
theStartSessionPacket = New Byte() _
{&H0, &H0, &H0, &H0, &H5, &H0, &H0, &H0, &H0, &H0, &H0, &H0}
Dim GUID_DEVINTERFACE_GRMNUSB As System.Guid
Dim DIDI As SP_DEVICE_INTERFACE_DATA
Dim DIDC As SP_DEVINFO_DATA
Dim DIDID As SP_DEVICE_INTERFACE_DETAIL_DATA
Dim len As Integer
Dim ip As IntPtr
Dim bytes As Byte() = Nothing
Dim devicePath As String = vbNullString
DIDI.cbSize = Marshal.SizeOf(DIDI)
DIDC.cbSize = Marshal.SizeOf(DIDC)
GUID_DEVINTERFACE_GRMNUSB = New
System.Guid("2C9C45C28E7D4C08A12D816BBAE722C0")
theDevInfo = SetupDiGetClassDevs(GUID_DEVINTERFACE_GRMNUSB,
vbNullString, IntPtr.Zero, DIGCF_DEVICEINTERFACE Or DIGCF_PRESENT)
If Not SetupDiEnumDeviceInterfaces(theDevInfo, IntPtr.Zero,
GUID_DEVINTERFACE_GRMNUSB, 0, DIDI) Then
theDevInfo = Nothing
Return
End If
DIDID = New SP_DEVICE_INTERFACE_DETAIL_DATA
DIDID.cbSize = 6 'Marshal.SizeOf(DIDID)
If Not SetupDiGetDeviceInterfaceDetail(theDevInfo, DIDI,
IntPtr.Zero, 0, len, IntPtr.Zero) Then
ip = Marshal.AllocHGlobal(len)
Marshal.StructureToPtr(DIDID, ip, True)
If SetupDiGetDeviceInterfaceDetail(theDevInfo, DIDI, ip,
len, len, IntPtr.Zero) Then
bytes = New Byte(len - 1) {}
Marshal.Copy(ip, bytes, 0, len)
devicePath =
System.Text.Encoding.Unicode.GetString(bytes, 4, bytes.Length - 4)
Else
Return
End If
End If
Dim usbpacketsize As IntPtr
usbpacketsize = Marshal.AllocHGlobal(4)
Dim theBytesReturned As Integer
hDevice = CreateFile(devicePath, GENERIC_READ Or GENERIC_WRITE,
_
IO.FileShare.ReadWrite, IntPtr.Zero, IO.FileMode.Open, 0,
IntPtr.Zero)
'Get the USB packet size, which we need for sending packets
If DeviceIoControl(hDevice, IOCTL_USB_PACKET_SIZE, IntPtr.Zero,
0, usbpacketsize, 4, theBytesReturned, IntPtr.Zero) Then
If theBytesReturned > 0 Then
Dim bytesTemp() As Byte
bytesTemp = New Byte(theBytesReturned - 1) {}
System.Runtime.InteropServices.Marshal.Copy(usbpacketsize, bytesTemp,
0, theBytesReturned)
If theBytesReturned = 2 Then
usb_packet_size = BitConverter.ToInt16(bytesTemp,
0)
End If
End If
Else
Marshal.FreeHGlobal(ip)
Return
End If
'send the startsessionpacket
SendPacket(theStartSessionPacket)
'MsgBox(hDevice.IsInvalid)
'get the ok from the device
Do
thePacket2 = GetPacket()
If thePacket2(0) = 0 And thePacket2(4) =
USBProtocolPacketID.Pid_Session_Started Then Exit Do
Loop
End Sub
Public Function GetPacket() As Byte()
Dim theNewBuffer As List(Of Byte)
Dim bufferSize As Integer
Dim theTempBuffer As Byte()
Dim theBytesReturned As Integer
theNewBuffer = New List(Of Byte)
Do
theTempBuffer = New Byte(ASYNC_DATA_SIZE - 1) {}
DeviceIoControl(hDevice, IOCTL_ASYNC_IN, IntPtr.Zero, 0,
theTempBuffer, ASYNC_DATA_SIZE, theBytesReturned, IntPtr.Zero)
bufferSize += theBytesReturned
theNewBuffer.AddRange(New List(Of
Byte)(theTempBuffer).GetRange(0, theBytesReturned))
If theBytesReturned < ASYNC_DATA_SIZE Then Exit Do
Loop
If theNewBuffer.Count > 0 Then
If theTempBuffer(0) = 0 And theTempBuffer(4) = 2 Then
' DataAvailable ...
theTempBuffer = New Byte(MAX_BUFFER_SIZE - 1) {}
theBytesReturned = 0
ReadFile(hDevice, theTempBuffer, MAX_BUFFER_SIZE,
theBytesReturned, IntPtr.Zero)
If theBytesReturned > 0 Then
theNewBuffer = New List(Of
Byte)(theTempBuffer).GetRange(0, theBytesReturned)
End If
Return theTempBuffer
Else
Return theTempBuffer
End If
End If
End Function
Public Sub SendPacket(ByVal aPacket As Byte())
Dim theBytesReturned As Integer
If Not WriteFile(hDevice, aPacket, aPacket.Length,
theBytesReturned, Nothing) Then
DisplayLastWin32Error()
End If
'If the packet size was an exact multiple of the USB packet
'size, we must make a final write call with no data
If usb_packet_size <> 0 Then
If (aPacket.Length Mod usb_packet_size = 0) Then
Dim newBytes() As Byte = New Byte() {}
WriteFile(hDevice, newBytes, 0, theBytesReturned,
IntPtr.Zero)
End If
End If
End Sub
#End Region
End Module
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.