【问题标题】:How do I get the friendly name of a USB device in Windows?如何在 Windows 中获取 USB 设备的友好名称?
【发布时间】:2017-06-30 15:35:35
【问题描述】:

我正在尝试获取插入式 USB 设备的“友好名称”。我正在使用带有 SPDRP_FRIENDLYNAME 属性的 SetupDiGetDeviceRegistryProperty 方法,但该方法返回 false 并将错误代码设置为 ERROR_INVALID_DATA,尽管其他属性(例如 SPDRP_DEVICEDESC 或 SPDRP_MFG)一切正常。

我检查了注册表和设备管理器,并且友好名称存在。

有人知道吗?

更新:到目前为止我尝试了什么:

GUID hidGuid;
HidD_GetHidGuid(&hidGuid);

HDEVINFO hDevInfo = SetupDiGetClassDevs(&hidGuid, 0, 0, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);

if (INVALID_HANDLE_VALUE == hDevInfo)
{
    AfxMessageBox(CString("SetupDiGetClassDevs(): ")
        + _com_error(GetLastError()).ErrorMessage(), MB_ICONEXCLAMATION);
    return;
}
SP_DEVINFO_DATA* pspDevInfoData =
    (SP_DEVINFO_DATA*)HeapAlloc(GetProcessHeap(), 0, sizeof(SP_DEVINFO_DATA));
pspDevInfoData->cbSize = sizeof(SP_DEVINFO_DATA);
for (int i = 0; SetupDiEnumDeviceInfo(hDevInfo, i, pspDevInfoData); i++)
{
    DWORD DataT;
    DWORD nSize = 0;
    TCHAR buf[MAX_PATH];
if (!SetupDiGetDeviceInstanceId(hDevInfo, pspDevInfoData, buf, sizeof(buf), &nSize))
    {
        AfxMessageBox(CString("SetupDiGetDeviceInstanceId(): ")
            + _com_error(GetLastError()).ErrorMessage(), MB_ICONEXCLAMATION);
        break;
    }
if (SetupDiGetDeviceRegistryProperty(hDevInfo, pspDevInfoData,
                    SPDRP_FRIENDLYNAME, &DataT, (PBYTE)buf, sizeof(buf), &nSize))
    { 
           //display buf
    }
else
    {
        if (GetLastError() == ERROR_INVALID_DATA)
        {
            //display ERROR_INVALID_DATA
        }
        if (SetupDiGetDeviceRegistryProperty(hDevInfo, pspDevInfoData, SPDRP_MFG, &DataT, (PBYTE)buf, sizeof(buf), &nSize))
        {
            //display buf
        }
        if (SetupDiGetDeviceRegistryProperty(hDevInfo, pspDevInfoData,
                SPDRP_DEVICEDESC, &DataT, (PBYTE)buf, sizeof(buf), &nSize))
        {
            // display buf
        }
   }
}

类似的东西。正如我所说,我得到了设备描述和设备制造商,但没有友好名称。

【问题讨论】:

  • “有人知道吗?” - 你的代码有问题。
  • 请提供一些代码来展示你到目前为止所做的尝试。

标签: c++ winapi usb


【解决方案1】:

并非所有设备都设置了SPDRP_FRIENDLYNAME 属性。在这种情况下,ERROR_INVALID_DATA 是预期的,它会告诉你。

当他们没有它时,设备管理器 GUI 使用另一个作为显示名称,SPDRP_DEVICEDESC

【讨论】:

  • 正如我所提到的,在设备管理器中,在友好名称属性下,有设备的实际名称,而设备描述类似于:USB 复合设备。
  • @dana 设备管理器会显示来自设备的 SPDRP_FRIENDLYNAME 值,但如果没有,它会在“友好名称”标签下显示 SPDRP_DEVICEDESC 值。
【解决方案2】:

也许有用的信息:

  1. 在我的例子中,我有两个网络适配器,但是当使用SPDRP_FRIENDLYNAME 时,该功能仅对设备管理器中显示为“... #2”的适配器成功。

    李>
  2. 我还可以验证另一个适配器(没有“... #2”)的注册表数据中没有值“FriendlyName”。

  3. 此行为似乎取决于操作系统。如果在 Windows 10 中使用SPDRP_FRIENDLYNAME 时,该功能总是会成功,但仅适用于设备管理器中显示为“...#2”的设备。

【讨论】:

    【解决方案3】:

    这个问题主要归结于 Windows 10 阻止未签名驱动程序的安装,即使“驱动程序”只是一个 .inf 文件,它只是引用一个(可能是签名的)Windows DLL,但是否可以更改“USB 串行设备” ”变成对人类有意义的东西,并且可以被应用软件识别。由于这个问题,我不得不重新编写 10 个不同的项目。

    我现在必须检查特定的 VID/PID,但这不是未来的证据。

    【讨论】:

      猜你喜欢
      • 2023-03-16
      • 2011-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-10
      相关资源
      最近更新 更多