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.