首页 > 解决方案 > 如何从 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 的这条信息。任何建议表示赞赏。

标签: windowswinapidevicemsdn

解决方案


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

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

在此处输入图像描述

有没有一种从总线关系(例如:{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 路径如下图,与其父级的总线关系之一相同。

在此处输入图像描述


推荐阅读