0

根据这篇博文,我编写了一些代码来检测 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。如何获得正确的设备名称?

4

1 回答 1

2

当添加到干净的项目中时,您链接的文章中的代码可以正常工作。当插入 USB 设备(例如闪存驱动器)时,分配给的值sDevString不为空,并且包含正确的设备字符串。

我只能想象有一些您没有显示的额外代码令人困惑。

我建议您逐字使用文章中的代码。复制并粘贴整个单元。那篇文章的作者在使您更容易使用代码方面做得很好。您只需直接使用该单元,无需进行任何更改。

如果您希望修改代码,您可以这样做。但是,一旦您确信所提供的代码可以正常工作,您就会知道是您的更改导致了任何失败。

于 2016-03-21T09:20:04.200 回答