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常に空の文字列であることです。また、(適切な GUID 値に設定して) WPD デバイスの検出を試みましたがrDbi.dbcc_classguid、常に空の文字列を取得することを除いて、正常に動作しますsDevString。正しいデバイス名を取得するにはどうすればよいですか?

4

1 に答える 1

2

リンクする記事のコードは、クリーンなプロジェクトに追加すると正しく機能します。フラッシュ ドライブなどの USB デバイスが挿入されると、割り当てられた値sDevStringは空ではなく、正しいデバイス文字列が含まれます。

問題を混乱させる、あなたが示していない余分なコードがあると想像することしかできません。

記事のコードをそのまま使用することをお勧めします。ユニット全体をコピーして貼り付けます。その記事の著者は、コードを簡単に使用できるようにするために優れた仕事をしてくれました。そのユニットを直接使用するだけで、変更を加える必要はありません。

コードを変更したい場合は、そうすることができます。しかし、提供されたコードが機能することを確信したら、失敗の原因は自分の変更にあることがわかります。

于 2016-03-21T09:20:04.200 に答える