如何从 Win32 API 中的总线关系中获取设备实例路径

Posted

技术标签:

【中文标题】如何从 Win32 API 中的总线关系中获取设备实例路径【英文标题】:How to get Device Instance path from Bus Relations in Win32 API 【发布时间】:2021-01-01 18:11:15 【问题描述】:

有没有从总线关系(例如:0.0.1.00000000.4234a4c6-3535-49d6-971c-76ce1f22521e)获取设备实例路径(例如:USB\VID_021D&PID_0C51&MI_00\6&192CE49&4&0000)的好方法?

我意识到 Windows 中的某些术语有别名,“设备实例路径”和“总线关系”是指在设备管理器中找到的两个属性:

我尝试从PropertyStore获取设备实例路径

int getProperty(std::string& sampleID)

   HRESULT hr = S_OK;
   IMMDeviceEnumerator* pEnumerator = NULL;


   //CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);

   hr = CoCreateInstance(__uuidof(MMDeviceEnumerator),
       NULL,
       CLSCTX_INPROC_SERVER,
       __uuidof(IMMDeviceEnumerator),
       (void**)&pEnumerator);

   if (hr != S_OK)
   
       // error cleanup
       return hr;
   

   IMMDevice* pEndpoint = NULL;
   std::wstring wSampleID(sampleID.begin(), sampleID.end());
   hr = pEnumerator->GetDevice(wSampleID.c_str(), &pEndpoint);
   if (hr != S_OK || pEndpoint == NULL)
   
       // error cleanup
       return hr;
   

   if (!pEndpoint)
   
       // error cleanup
       return hr;
   

   IPropertyStore* pProps = NULL;
   hr = pEndpoint->OpenPropertyStore(
       STGM_READ, &pProps);

   PROPVARIANT varName;
   // Initialize container for property value.
   PropVariantInit(&varName);

   hr = pProps->GetValue(
       PKEY_AudioEndpoint_GUID, &varName);
   if (hr != S_OK)
   
       //error cleanup
       return hr;
   
   std::cout << varName.pwszVal << std::endl;

   PropVariantClear(&varName);
   SAFE_RELEASE(pProps)
   SAFE_RELEASE(pEndpoint)
   SAFE_RELEASE(pEnumerator);
   return hr;

但似乎没有属性键来检索音频端点 IMMDevice 的这条信息。任何建议表示赞赏。

【问题讨论】:

Bus Relations - 这是什么以及如何得到它? @RitaHan-MSFT 我有一些具有多个接口的复合设备的总线关系(设备 GUID)。一个示例是耳机 + 麦克风设备,它产生两个总线关系字符串,一个用于耳机,另一个用于麦克风。我的目标是将属于同一物理设备的总线关系分组。由于设备实例路径包含 PID、VID 和一些端口唯一字符串等信息,因此获取这些信息将帮助我实现目标。 @RbMm Bus Relation 是设备的设备 GUID,它可以从 PropertyStore 中检索到,键为 PKEY_AudioEndpoint_GUID。它也可以在设备管理器 -> 设备属性 -> 总线关系中找到。我从 Goodle Webrtc 音频设备枚举中得到了这个 GUID。 【参考方案1】:

例如,耳机 + 麦克风设备会产生两个 总线关系字符串,一个用于耳机,另一个用于麦克风。 我的目标是将属于同一物理的 Bus Relations 分组 设备。

属于同一物理设备的

总线关系已经分组,您可以通过同一物理音频设备的“总线关系”属性获取(父)。您可以通过设备管理器(查看 -> 按连接的设备)找到它,如下所示:

有没有获取设备实例路径的好方法(例如: USB\VID_021D&PID_0C51&MI_00\6&192CE49&4&0000) 来自 Bus Relations (例如:0.0.1.00000000.4234a4c6-3535-49d6-971c-76ce1f22521e)?

虽然尚不清楚您将使用什么分组的总线关系。但您会发现,并非所有 (USB) 设备都具有以下格式的设备实例路径USB\VID_xxxx&amp;PID_xxxx*。以上面截图中的 Microphone 为例,它的 Device Instance 路径如下图,与其父节点的总线关系之一相同。

【讨论】:

以上是关于如何从 Win32 API 中的总线关系中获取设备实例路径的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中从 MIDI 设备获取 ID

Win32_PnPEntity 没有获取隐藏设备

python --获取本机屏幕分辨率

无法理解普通 c++ 与 vc++、win32 编程、mfc、win32 api、CLI 之间的关系 [关闭]

ARM - 使用 16 位数据总线获取 32 位数据

如何在按钮单击时从win32 c ++中的文本框获取文本?