Entwickler-Ecke
Windows API - Libusb-Beispiel unter Delphi XE ausführen funktioniert nicht
Geri - Do 30.06.11 12:35
Titel: Libusb-Beispiel unter Delphi XE ausführen funktioniert nicht
Hallo zusammen
Ich habe DelphiLibUSB-WIN32 heruntergeladen und wenn ich das Beispielprogramm, welches die angeschlossene USB-Geräte anzeigen soll, mit Delphi 2005 personal compilere und ausführe, dann funktioniertes einwandfrei.
Wenn ich nun mit Delphi XE das Gleiche mache, dann wird kein Gerät gefunden.
Die Compilereinstellungen habe ich verglichen. Diese müssten passen.
Habt ihr vielleicht eine Idee an was es noch liegen könnte?
Beste Grüsse
Geri
guinnes - Do 30.06.11 13:05
Unter Delphi 2005 sind Strings Ansi-Strings, unter XE sind Strings Unicode-Strings, das dürfte der Grund sein
Geri - Do 30.06.11 15:19
Vielen Dank
Dem werde ich mal nachgehen und morgen dann berichten. Mit D2007 funktioniert das Programm übrigens auch noch.
Beste Grüsse
Geri
jaenicke - Do 30.06.11 16:15
Bis Delphi 2007 waren Strings auch AnsiStrings und ab Delphi 2009 UnicodeStrings, das ist genau die Grenze.
Geri - Fr 01.07.11 08:49
Hallo zusammen
Zuerst nochmals Danke für eure schnelle Hilfe!
Also ich habe nun weitergemacht und momentan habe ich das Gefühl, das Problem liegt schon vor der String-Abfrage.
Der Code meines Beispiels sieht so aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| var bus: pusb_bus; dev: pusb_device; udev: pusb_dev_handle;
begin usb_init; myEndPoint:=5;
usb_find_busses; usb_find_devices; bus := usb_get_busses; Writeln('bus/device idVendor/idProduct'); while Assigned(bus) do begin dev := bus^.devices; while Assigned(dev) do begin writeln(bus^.dirname, '/', dev^.filename, ' ', '0x' + IntToHex(dev^.descriptor.idVendor, 4), '/', '0x' + IntToHex(dev^.descriptor.idProduct, 4)); |
die Variable bus weist auf einen gültigen Zeiger
Die Varialbe dev liefert aber bereits Nil. Sie ist vom Typ pusb_device mit folgender Struktur. Sie bleibt aber Nil, bei Delphi 2005 resp 2007 nicht.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| const LIBUSB_PATH_MAX = 512; type pusb_device = ^usb_device; pusb_bus = ^usb_bus;
usb_device = packed record next, prev: pusb_device; filename: packed array [0..LIBUSB_PATH_MAX-1] of char; bus: pusb_bus; descriptor: usb_device_descriptor; config: PArray_usb_config_descriptor;
dev: pointer; end; |
Alle Funktionen sind aus einer DLL.
Danke für Eure Tipps im Voraus und best Grüsse
Geri
jaenicke - Fr 01.07.11 09:28
Geri hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3: 4:
| usb_device = packed record next, prev: pusb_device; filename: packed array [0..LIBUSB_PATH_MAX-1] of char; | |
Da ist garantiert AnsiChar gemeint. Das musst du schon alles entsprechend umschreiben, sonst kann das nicht gehen. Char --> AnsiChar, PChar --> PAnsiChar, String --> AnsiString, ...
Dann könnte es schon gehen. Sauber ist die Unit auch nicht geschrieben, sonst hätte man dort schon explizit diese Typen benutzt...
Geri - Fr 01.07.11 09:56
Vielen Dank dür deine Hilfe, Sebastian!
Wahrscheinlich habe ich ein Brett vor dem Kopf. Das Problem tritt aber schon in Zeile 18 auf. Dort geht es noch gar nicht um die Stringabfrage...?
Ich habe die Typen char und pChar nun geändert. Eine Verbesserung ist mir allerdings aufgefallen.
Änderung
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| usb_bus = packed record next, prev: pusb_bus; dirname: packed array [0..LIBUSB_PATH_MAX-1] of Ansichar; devices: pusb_device; location: longint; end; |
Wenn ich debugge, dann sehe ich, dass die Variable bus^.dirname nun den Namen bus - \0 enthält. Bei der vorherigen Version standen cryptische Zeichen drin.
Trotzdem zeigt aber die Variable devices eben immer noch auf Nil
Beste Grüsse
Geri
Geri - Fr 01.07.11 17:45
Hallo zusammen
Als es funktioniert nun. Das Problem lag, wie guinnes und Sebastian gemeint hanben, an der Definition der Strings in der libusb.pas. :beer:
Ich hatte zuvor beim Debuggen den Fehler gemacht, dass ich beim Betrachten der Variablen bus^.device den Cursor auf device hatte:) Richtig wäre auf bus gewesen
Für all jene, dies es interessiert oder vielleicht mal das gleiche Problem haben die notwendigen Änderungen.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| usb_device = packed record next, prev: pusb_device; filename: packed array [0..LIBUSB_PATH_MAX-1] of Ansichar; bus: pusb_bus; descriptor: usb_device_descriptor; config: PArray_usb_config_descriptor;
dev: pointer; end;
usb_bus = packed record next, prev: pusb_bus; dirname: packed array [0..LIBUSB_PATH_MAX-1] of Ansichar; devices: pusb_device; location: longint; end;
function usb_strerror: pAnsichar; stdcall; |
geändert.
Beste Grüsse und vielen Dank für eure schnelle Hilfe, super gemacht!!
Geri
[mod="Christian S."]Delphi-Tags repariert/mod]
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!