2016-03-21 3 views
0

Basé sur this blog post, j'ai écrit un code pour détecter les périphériques USB:événements d'interface de périphérique, obtenir le nom du périphérique

PDevBroadcastDeviceInterface = ^DEV_BROADCAST_DEVICEINTERFACE; 
DEV_BROADCAST_DEVICEINTERFACE = record 
    dbcc_size : DWORD; 
    dbcc_devicetype : DWORD; 
    dbcc_reserved : DWORD; 
    dbcc_classguid : TGUID; 
    dbcc_name : char; 
end; 

. 
. 
. 

procedure TUsbClass.RegisterUsbHandler; 
var rDbi : DEV_BROADCAST_DEVICEINTERFACE; 
    iSize : integer; 
begin 
    iSize := SizeOf(DEV_BROADCAST_DEVICEINTERFACE); 
    ZeroMemory(@rDbi,iSize); 
    rDbi.dbcc_size := iSize; 
    rDbi.dbcc_devicetype := USB_INTERFACE; 
    rDbi.dbcc_reserved := 0; 
    rDbi.dbcc_classguid := GUID_DEVINTF_USB_DEVICE; 
    rDbi.dbcc_name := #0; 
    RegisterDeviceNotification(FHandle,@rDbi,DEVICE_NOTIFY_WINDOW_HANDLE); 
end; 

procedure TUsbClass.WMDeviceChange(var AMessage : TMessage); 
var iDevType : integer; 
    sDevString,sDevType, 
    sDriverName,sFriendlyName : string; 
    pData : PDevBroadcastDeviceInterface; 
    pVol : PDEV_BROADCAST_VOLUME; 
begin 
    if (AMessage.wParam = USB_INSERTION) or 
    (AMessage.wParam = USB_REMOVAL) then begin 
    pData := PDevBroadcastDeviceInterface(AMessage.LParam); 
    iDevType := pData^.dbcc_devicetype; 

    if iDevType = USB_VOLUME then 
     if Assigned(FOnDevVolumeEvent) then begin 
     ... 
     end 
     else 
    else 
    // Is it a USB Interface Device ? 
    if iDevType = USB_INTERFACE then begin 
     sDevString := PChar(@pData^.dbcc_name); 
     ... 
    end; 
    end; 
end; 

Tout fonctionne très bien et je ne reçois des événements lorsqu'un périphérique USB est inséré, mais le problème est que sDevString est toujours une chaîne vide. J'ai également essayé de détecter des périphériques WPD (en réglant rDbi.dbcc_classguid à la bonne valeur GUID) et cela fonctionne bien, sauf que je reçois toujours une chaîne vide pour sDevString. Comment puis-je obtenir le bon nom de périphérique?

+0

J'ai ajouté la définition de PDevBroadcastDeviceInterface à partir du blog. –

Répondre

2

Le code de l'article que vous liez fonctionne correctement lorsqu'il est ajouté à un projet propre. Lorsqu'un périphérique USB, par ex. un lecteur flash est inséré, la valeur affectée à sDevString n'est pas vide et contient la chaîne de périphérique correcte.

Je ne peux qu'imaginer qu'il y a du code supplémentaire que vous n'avez pas montré qui soit source de confusion.

Je vous suggère d'utiliser le code de l'article verbatim. Copiez et collez l'ensemble de l'unité. L'auteur de cet article a fait un bon travail pour vous faciliter l'utilisation du code. Vous utilisez simplement cette unité directement, vous n'avez pas besoin de faire des changements.

Si vous désirez adapter le code, vous pouvez le faire. Mais une fois que vous vous êtes convaincu que le code tel que fourni fonctionne, vous saurez que ce sont vos modifications qui sont responsables de tout échec.

+0

Vous avez absolument raison. Mon code avait un '@' manquant dans 'sDevString: = PChar (@ pData^.dbcc_name);'. –

+0

Le code de la question est correct. Avez-vous collé le mauvais code? Est-ce que votre code est différent? C'est pourquoi il est important de coller du code réel et de fournir [mcve]. –