Autor Beitrag
Geri
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78

XP
RAD Studio XE pro
BeitragVerfasst: Do 30.06.11 12:35 
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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 182
Erhaltene Danke: 14



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78

XP
RAD Studio XE pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19313
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 30.06.11 16:15 
Bis Delphi 2007 waren Strings auch AnsiStrings und ab Delphi 2009 UnicodeStrings, das ist genau die Grenze.
Geri Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78

XP
RAD Studio XE pro
BeitragVerfasst: 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:

ausblenden 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; // Initialize libusb
  myEndPoint:=5;

  usb_find_busses; // Finds all USB busses on system
  usb_find_devices; // Find all devices on all USB devices
  bus := usb_get_busses; // Return the list of USB busses found

  Writeln('bus/device  idVendor/idProduct');
  while Assigned(bus) do   // es wir ein bus gefunden
    begin
      dev := bus^.devices;
      while Assigned(dev) do   // <--------- breits hier wird nil geliefert
        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.


ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
// Auszug aus der Datei Libusb.pas, in welcher die Schnittstelle zur Dll USBLibExport.dll definiert ist
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-1of char;
    bus: pusb_bus;
    descriptor: usb_device_descriptor;
    config: PArray_usb_config_descriptor;

    dev: pointer; // Darwin support
  end;



Alle Funktionen sind aus einer DLL.

Danke für Eure Tipps im Voraus und best Grüsse

Geri
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19313
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 01.07.11 09:28 
user profile iconGeri hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
  usb_device = packed record
    next,
    prev: pusb_device;
    filename: packed array [0..LIBUSB_PATH_MAX-1of 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78

XP
RAD Studio XE pro
BeitragVerfasst: 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
ausblenden 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-1of Ansichar; // ÄNDERUNG, 01072011
  //  dirname: packed array [0..LIBUSB_PATH_MAX-1] of char; 
    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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78

XP
RAD Studio XE pro
BeitragVerfasst: 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.

ausblenden 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 char;
    filename: packed array [0..LIBUSB_PATH_MAX-1of Ansichar;
    bus: pusb_bus;
    descriptor: usb_device_descriptor;
    config: PArray_usb_config_descriptor;

    dev: pointer; // Darwin support
  end;

  usb_bus = packed record
    next,
    prev: pusb_bus;
    dirname: packed array [0..LIBUSB_PATH_MAX-1of Ansichar;
  //  dirname: packed array [0..LIBUSB_PATH_MAX-1] of char;
    devices: pusb_device;
    location: longint;
   end;

//function usb_strerror: pchar; stdcall;
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]