我正在尝试获取插入式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
}
}
}
像这样的东西。正如我所说,我得到设备描述和设备制造商,但不是友好名称。
答案 0 :(得分:1)
并非所有设备都设置了ERROR_INVALID_DATA
属性。在这种情况下,SPDRP_DEVICEDESC
是预期的,它就会告诉你。
当他们没有它时,设备管理器GUI使用另一个显示名称http://localhost:1234/learn/webpage/jquery-easyui-1.5.2/datagrid/basic.html
答案 1 :(得分:0)
也许有用的信息:
在我的情况下,我有两个网络适配器,但该功能仅对显示为" ...#2"的适配器成功。在使用SPDRP_FRIENDLYNAME
时在设备管理器中。
我还可以验证另一个适配器(没有" ...#2")没有值" FriendlyName"在其注册数据中。
此行为似乎取决于操作系统。在可能的情况下,当SPDRP_FRIENDLYNAME
使用Windows 10时,功能总是成功,但仅适用于显示为" ...#2"在设备管理器中。
答案 2 :(得分:0)
此问题主要归因于Windows 10停止安装未签名的驱动程序,即使“驱动程序”只是一个.inf文件,该文件仅引用了(假定已签名的)Windows DLL,但在那里可以更改“ USB串行设备” ”对人类有意义,并被应用软件识别。由于这个问题,我不得不重新编写10个不同的项目。
我现在必须检查特定的VID / PID,但这不是将来的证明。