Bonjour,
Je m'initie actuellement à Qt Creator (Qt 5.10.1 et Qt Creator 4.5.1) et j'ai décidé de m'attaquer à la bibliothèque USB libusb 1.0.22.
Je suis sous Windows 7 64 bits mais je compile pour un environnement 32 bit avec MinGW 32 pour pouvoir éventuellement porter sur des PC plus anciens (XP) ou périphériques Android.

Donc comme je le disais dans le titre, j'ai assemblé quelques lignes de programme trouvées sur le net pour énumérer les périphériques connectés (donne le nombre), et qui donne :
- leur classe
- leur VID
- leur PID
- le nom du constructeur (quand il n'y a pas d'erreur lors de l'ouverture)
- le produit (quand il n'y a pas d'erreur lors de l'ouverture)

Mon premier petit exercice c'est d'accéder à une clé USB SanDisk Cruser Switch 4Go dont j'ai trouvé les ID dans le panneau de config (VID: 0781, PID: 5572).

Lorsque je lance mon programme, je retrouve bien le VID/PID de ma clé dans la liste, mais la classe est erronée (classe 0) ce qui provoque une erreur d'ouverture, donc pas d'accès aux infos Constructeur et Produit. De plus je retrouve bien ma souris, mon clavier et mon Pickit 3 (sonde de programmation microcontrôleur Microchip)

voici mon code main.cpp :
Code:
#include "mainwindow.h"
#include <QApplication>
#include <iostream>
#include <libusb.h>

using namespace std;

void printdev(libusb_device *dev)
{
    struct libusb_device_handle *handle = NULL;
    libusb_device_descriptor desc;
    int r = libusb_get_device_descriptor(dev, &desc);
    if (r < 0)
        {
        cout << "Failed to get device descriptor" << endl;
        return;
        }
    cout << "Device Class: " << (int)desc.bDeviceClass << endl;
    cout << "VendorID: " << hex << desc.idVendor << endl;
    cout << "ProductID: " << hex << desc.idProduct << endl;

    // Open the device
    r = libusb_open(dev, &handle);
    if (r < 0)
        {
        printf("Error opening device\n");
        return;
        }

    char str1[256];
    // Get the iManufacturer to str1
    r = libusb_get_string_descriptor_ascii(handle, desc.iManufacturer, (unsigned char*) str1, sizeof(str1));
    if (r < 0)
        {
        printf("Manufacturer not found\n");
        libusb_close(handle);
        return;
        }
    cout << "Manufacturer: " << str1 << endl;

    // Get the iProduct to str1
    r = libusb_get_string_descriptor_ascii(handle, desc.iProduct, (unsigned char*) str1, sizeof(str1));
    if (r < 0)
        {
        libusb_close(handle);
        return;
        }
    cout << "Product: " << str1 << endl;

    // Get the iSerial to str1
    r = libusb_get_string_descriptor_ascii(handle, desc.iSerialNumber, (unsigned char*) str1, sizeof(str1));
    if (r < 0)
        {
        libusb_close(handle);
        return;
        }
    cout << "Serial No: " << str1 << endl;
    libusb_close(handle);
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;

    libusb_device **devs;
    libusb_context *ctx = NULL; //a libusb context for library intialization
    int r = libusb_init(&ctx); //initializing the library
    if (r < 0)
        {
        cout << "Init Error " << r << endl; // There was an error
        return 1;
        }

    //libusb_set_option(ctx, LIBUSB_OPTION_LOG_LEVEL);
    int cnt = libusb_get_device_list(ctx, &devs); // Get the list of devices
    if (cnt < 0)
        {
        cout << "Get Device Error" << endl; // There was an error
        }
    cout << cnt << " devices in list." << endl; // Print total number of usb devices
    for (int i = 0; i < cnt; i++)
        {
        printdev(devs[i]); // Print specs of this device
        cout << "-----------------------" << endl;
        }

    libusb_free_device_list(devs, 1); // Free the list, unref the devices in it
    libusb_exit(ctx); // Close the session
    w.show();
    return a.exec();
}
Voici ce qui en résulte :
Code:
9 devices in list.
Device Class: 9
VendorID: 8086
ProductID: 8c26
Error opening device
-----------------------
Device Class: 9
VendorID: 8086
ProductID: 8c2d
Error opening device
-----------------------
Device Class: 0
VendorID: 46d
ProductID: c077
Manufacturer: Logitech
Product: USB Optical Mouse
-----------------------
Device Class: 0
VendorID: 4d8
ProductID: 900a
Manufacturer: Microchip Technology Inc.
Product: PICkit 3
Serial No: BUR142163887
-----------------------
Device Class: 0
VendorID: 781
ProductID: 5572
Error opening device
-----------------------
Device Class: 0
VendorID: 413c
ProductID: 2105
Manufacturer: Dell
Product: Dell USB Keyboard
-----------------------
Device Class: 9
VendorID: 8087
ProductID: 8000
Error opening device
-----------------------
Device Class: 9
VendorID: 8087
ProductID: 8008
Error opening device
-----------------------
Device Class: 9
VendorID: 8086
ProductID: 8c31
Error opening device
-----------------------
Est-ce que quelqu'un aurait une idée de quoi ça peut venir? Car si je ne me trompe pas une clé USB c'est du stockage de masse, donc classe 8 d'après USB.org. Est-ce que c'est le contrôleur USB du PC qui peut fausser les données? (Je ne peux tester que sur ce PC pour le moment)

Merci