Gast monyplaba Geschrieben 11. Juni 2006 Teilen Geschrieben 11. Juni 2006 Hallo, ich habe ein Programm in VB .NET erstellt das mir dazu hilft Daten an meinem per USB angeschlossenem Gerät zu senden bzw. empfangen! wenn ich es in der IDE Microsoft Visual Basic 2005 Express kompiliere und teste funktioniert die Kommunikation wunderbar aber wenn ich die .exe Datei im Ordner bin/release oder bin/Debug benutze um das Programm zu testen dann hängt es an der Stelle wo ich mit meinem Gerät kommunizieren möchte und zwar bei der Funktion "deviceiocontrol()"! an der stelle passiert einfach nichts was wohl heißt dass das programm darauf wartet dass mein gerät daten schickt was aber nie passiert und ich muß dann das Programm abbrechen! was könnte der Grund sein dass mein Programm innnerhalb der entwicklungsumgebung wunderbar funktioniert und außerhalb nicht? Danke für eure Hilfe Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Trux Geschrieben 12. Juni 2006 Teilen Geschrieben 12. Juni 2006 häufig können geschwindigkeits unterschiede im Debug modus zum Kompielierten stand änderungen im Programm verursachen. Hast du mal versucht die exe aus dem debug verzeichnis auserhalb der IDE auszuführen? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Gast monyplaba Geschrieben 12. Juni 2006 Teilen Geschrieben 12. Juni 2006 es ist eigentlich so: gibt es allgemein Probleme mit dem Typ microsoft.win32.SafeFileHandles in Windows? denn wenn ich versuche meine .exe datei in ordner release oder debug auszufü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 kann denn das bedeuten? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Trux Geschrieben 14. Juni 2006 Teilen Geschrieben 14. Juni 2006 ich denke weniger dass das problem an der Windows API liegt, sonder viel eher an dir bzw an deiner implementation. Aber im bezug auf die API kann ich nicht viel sagen da ich davon nicht sonderlich viel ahnung habe. Zu deiner Implementation auch nicht, da sinnvolle stellen aus deinem Code fehlen. Ich denke wenn du ein par wichtige Passagen postest, wirst du eher eine sinnvolle Antwort erhalten, sind doch einige hier die von dem API-Krams ne Ahnung haben. Aber was ich mir als mögliche Uhrsache vorstellen kann, ist das du sicherlich von der API ein Handle bekommst um auf dein USB teil zuzugreifen. Wenn du nun den Handle abfragst, und dann damit arbeitest kann der Fehler daher rühren das du im Debug automatisch die nötige zeit wartes bis Windows "so weit ist" aber in der Laufzeit läuft dein Programm Windows einfach davon und so hast du evtl ein ungültigen Handle mit dem du auf dein USB-Teil zugreifst. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 14. Juni 2006 Teilen Geschrieben 14. Juni 2006 Wenn du ein ungültiges Handle bekommst, dann ist vermutlich schon CreateFile fehlgeschlagen. Welchen Wert hat denn das IsInvalid-Property nach CreateFile? Der klassische Weg, WinAPI-Dateihandles zu deklarieren, ist als IntPtr. Hast du das mal ausprobiert? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Gast monyplaba Geschrieben 14. Juni 2006 Teilen Geschrieben 14. Juni 2006 ja ich habe beides ausprobiert wenn ich SafeFileHandle benutze ist IsInvalid = False wenn ich Intptr benutze ist der Wert so um die 982 und das alles gleich nach CreateFile und gleich vor WriteFile also heißt es CreateFile klappt! das ist der Fall außerhalb und innerhalb der IDE nur außerhalb der IDE bekomme ich nach WriteFile den error "Invalid Handle"! ich weiß was beim debugging schiefgelaufen denn so wie es aussieht funktioniert mein programm nur mit debugging was könnte das für einen grund haben? Danke Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 14. Juni 2006 Teilen Geschrieben 14. Juni 2006 Funktioniert es denn, wenn du das Programm aus der IDE ohne den Debugger startest? Wenn nicht, handelt es sich wohl tatsächlich um ein Timingproblem. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Gast monyplaba Geschrieben 14. Juni 2006 Teilen Geschrieben 14. Juni 2006 das funktioniert nicht wenn ich ohne Debugger teste aus der IDE oder in der IDE in Release Modus ich habe noch was gemerkt das ist mein alter Aufruf von WriteFile Dim bool As Integer = WriteFile(hDevice, aPacket, aPacket.Length - 1, theBytesReturned, Nothing) wenn ich es durch diesen ersetzte Dim bool As Integer = WriteFile(hDevice, aPacket, aPacket.Length - 1, theBytesReturned, IntPtr.Zero) also wenn ich Nothing durch Intptr.zero, dann bekomme ich die gleiche Fehlermeldung "Invalid Handle" sowohl außer als auch in der IDE was hat denn das zu bedeuten? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 14. Juni 2006 Teilen Geschrieben 14. Juni 2006 was hat denn das zu bedeuten?Das muss gar nichts bedeuten. Wenn wirklich ein Timingproblem vorliegt, kannst du aus solchen Beobachtungen nicht viel folgern. Setz doch mal ein taktisches Sleep zwischen CreateFile und WriteFile. Was für ein Gerät ist das denn? Gibt es eine Dokumentation des Treibers? Was macht dein Programm währenddessen sonst noch so? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Gast monyplaba Geschrieben 14. Juni 2006 Teilen Geschrieben 14. Juni 2006 das ist mein code ab createfile bis writefile" nach createfile ermittelt er mit deviceiocontrol die usb packet size dass ich brauche um daten zu schicken dass mit dem sleep habe ich noch nicht ausprobiert! wie soll es denn aussehen? hDevice = CreateFile(devicePath, GENERIC_READ Or GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0) '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 bytes1() As Byte bytes1 = New Byte(theBytesReturned - 1) {} Marshal.Copy(usbpacketsize, bytes1, 0, theBytesReturned) If theBytesReturned = 2 Then usb_packet_size = BitConverter.ToInt16(bytes1, 0) End If End If Else Marshal.FreeHGlobal(ip) Return End If 'send the startsessionpacket SendPacket(theStartSessionPacket) //das ist die methode sendpacket Public Sub SendPacket(ByVal aPacket As Byte()) Dim theBytesReturned As Integer Dim bool As Integer = WriteFile(hDevice, aPacket, aPacket.Length - 1, theBytesReturned, IntPtr.Zero) If bool = INVALID_HANDLE_VALUE Or bool = 0 Then DisplayLastWin32Error() theDevInfo = IntPtr.Zero Return 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 newBytes = New Byte() {} WriteFile(hDevice, newBytes, 0, theBytesReturned, IntPtr.Zero) End If End If End Sub Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Gast monyplaba Geschrieben 14. Juni 2006 Teilen Geschrieben 14. Juni 2006 Das muss gar nichts bedeuten. Wenn wirklich ein Timingproblem vorliegt, kannst du aus solchen Beobachtungen nicht viel folgern. Setz doch mal ein taktisches Sleep zwischen CreateFile und WriteFile. Was für ein Gerät ist das denn? Gibt es eine Dokumentation des Treibers? Was macht dein Programm währenddessen sonst noch so? das ist ein navigationsgerät von garmin streetpilot 2720! ja es gibt auch eine dokumentation! ohne die hätte ich überhaupt nicht den ganzen code geschrieben! aber da finde ich wohl nicht die lösung für mein problem! glaube ich zumidest Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
k4fu Geschrieben 14. Juni 2006 Teilen Geschrieben 14. Juni 2006 lass dir doch mal das handle im ide modus via msgbox oder nem textfile ausgeben... oder mach einfach eine schleife, die die funktion erst dann ausführt, wenn ein korrektes handle vorhanden ist Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Gast monyplaba Geschrieben 14. Juni 2006 Teilen Geschrieben 14. Juni 2006 das problem habe ich doch lösen können ich hätte den letzten parameter von WriteFile als ByVal und nicht ByRef definieren sollen Danke für deine Hilfe Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.