2016-03-21 2 views
0

Основываясь на this blog post, я написал код для обнаружения USB устройств:Интерфейс События устройства, получить имя устройства

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; 

Все работает отлично, и я получать события, когда устройство USB вставлен, но проблема что sDevString всегда пустая строка. Я также пытался обнаружить WPD-устройства (установив rDbi.dbcc_classguid на правильное значение GUID), и он отлично работает, за исключением того, что я всегда получаю пустую строку для sDevString. Как я могу получить правильное имя устройства?

+0

Я добавил определение PDevBroadcastDeviceInterface из сообщения в блоге. –

ответ

2

Код в статье, которую вы связываете, работает правильно, когда добавляется в чистый проект. Когда устройство USB, например, установлен флеш-накопитель, значение, назначенное на sDevString, не является пустым и содержит правильную строку устройства.

Я могу только представить, что есть какой-то дополнительный код, который вы не показали, что путает вопросы.

Предлагаю вам использовать код из статьи стенографически. Скопируйте и вставьте весь блок. Автор этой статьи проделал хорошую работу по упрощению использования кода. Вы просто используете это устройство напрямую, вам не нужно вносить какие-либо изменения.

Если вы хотите адаптировать код, вы можете сделать это. Но как только вы убедитесь, что код, как указано, работает, вы будете знать, что именно ваши изменения отвечают за любые сбои.

+0

Вы абсолютно правы. В моем коде отсутствовал '@' в 'sDevString: = PChar (@ pData^.dbcc_name);'. –

+0

Код в правиле. Вы ввели неправильный код? Ваш код отличается. Вот почему важно вставить реальный код и предоставить [mcve]. –

Смежные вопросы