События интерфейса устройства, получить имя устройства

Основываясь на этом сообщении в блоге, я написал код для обнаружения 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, Как я могу получить правильное имя устройства?

1 ответ

Решение

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

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

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

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

Другие вопросы по тегам