2016-03-21 152 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]很重要的原因。 –