mikrocontroller.net

Forum: PC-Programmierung SafeFileHandle Problem?


Autor: monyplaba (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: MasterFX (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: monyplaba (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.