如何从 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&PID_xxxx*
。以上面截图中的 Microphone 为例,它的 Device Instance 路径如下图,与其父节点的总线关系之一相同。
【讨论】:
以上是关于如何从 Win32 API 中的总线关系中获取设备实例路径的主要内容,如果未能解决你的问题,请参考以下文章