Thread Win32::API und LibUSB-Win32 (36 answers)
Opened by rosti at 2017-02-03 11:40

FIFO
 2017-02-08 00:19
#186070 #186070
User since
2005-06-01
469 Artikel
BenutzerIn

user image
Aha. Also kann man davon ausgehen, dass die structs bytegenau im Speicher abgebildet sind (zumindest wenn RC_INVOKED nicht defined).

Ich hab mal durch Dein Modul geschaut, der Kostruktor sieht ok aus, bis vor den Methodenaufrufen
Code (perl): (dl )
1
2
3
4
5
6
    $self->_get_busses;
    $self->_get_fst_device;
    $self->_get_configuration;
    $self->_get_interface;

    $self->_usb_open;


In _get_busses ist nicht alles so einsichtig, hab mal Orientierungskommentare platziert:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
sub _get_busses{
    my $self = shift;
    my $usb_get_busses = Win32::API->new('libusb0', 'int usb_get_busses()');
    my $bus_addr = $usb_get_busses->Call();
        #print $bus_addr,"\n";

# Erstes usb_bus-struct einlesen und entpacken
    my $mem_usb_bus = ReadMemory($bus_addr, 532);
    my %usb_bus;
    @usb_bus{qw(next prev dirname devices location root_dev)} = unpack "VVZ512VVV", $mem_usb_bus;

# In $usb_bus{devices} ist also jetzt die Adresse des ersten usb_device-structs im ersten usb_bus

# ab hier ??? ---------------------------------------------------
    Win32::API::Struct->typedef(
        'usb_bus',
        "INT_PTR","devices"         # ???
    );
    my $usb_bus = Win32::API::Struct->new( 'usb_bus');
    #$self->dd($usb_bus);
# bis hier ??? --------------------------------------------------

    $self->{usb_bus} = \%usb_bus;
}


Sollte aber eigentlich trotzdem klappen ... _get_fst_device scheint auf den ersten Blick ok, zumindest das unpack-Pattern. Weiter kam ich noch nicht.

Ab wo bekommst Du denn Probleme?

Btw halte ich es für riskant, sich auf bestimmte struct-Repräsentationen im Speicher zu verlassen. Spätere libusb-Versionen haben wahrscheinlich eine andere Datenstruktur-Grundlage.

edit: Ich frag mich die ganze Zeit: Warum schreibst Du nicht eine Wrapper-DLL, die den Low-Level-Kram in C erledigt und ein einfaches Interface für Win32::API bereitstellt?
Last edited: 2017-02-08 07:09:01 +0100 (CET)
Everyone knows that debugging is twice as hard as writing a program in the first place. So if you're as clever as you can be when you write it, how will you ever debug it? -- Brian Kernighan: "The Elements of Programming Style"

View full thread Win32::API und LibUSB-Win32