windows - 如何从 Win32 API 中的总线关系获取设备实例路径
问题描述
有没有一种从总线关系(例如:{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 的这条信息。任何建议表示赞赏。
解决方案
一个示例是耳机 + 麦克风设备,它产生两个总线关系字符串,一个用于耳机,另一个用于麦克风。我的目标是将属于同一物理设备的总线关系分组。
属于同一物理设备的总线关系已经分组,您可以通过同一物理音频设备(父)的“总线关系”属性获取它。您可以通过设备管理器(按连接查看 -> 设备)找到它,如下所示:
有没有一种从总线关系(例如:{0.0.1.00000000}.{4234a4c6-3535-49d6-971c-76ce1f22521e})中获取设备实例路径(例如:USB\VID_021D&PID_0C51&MI_00\6&192CE49&4&0000)的好方法?
尽管尚不清楚您将使用什么分组的总线关系。但是您会发现并非所有(USB)设备都具有这种格式的设备实例路径USB\VID_xxxx&PID_xxxx*
: . 以上面快照中显示的 Microphone 为例,它的 Device Instance 路径如下图,与其父级的总线关系之一相同。
推荐阅读
- angular - Angular rxjs:在创建和订阅observer_2之前等待observer_1完成
- python - 如何从嵌套函数为变量赋值
- django - 如何只显示过滤器表单?
- javascript - 从动态填充的表格 JavaScript 中的特定行获取特定的单元格值
- haskell - 是否可以在异常情况下访问`WriterT`的部分收集`tell`s?
- cuda - 如何将 cuda 输入数组复制到共享数组中?
- r - 如何在 lm() 中使用虚拟变量作为因变量?
- ruby - 为什么我会得到一个额外的尾随空格以及如何摆脱它?
- javascript - Firebase onAuthStateChanged 和 Redux 状态
- azure - 将 ZIP 文件部署到 Azure 应用服务不起作用