You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于通过PDEV_BROADCAST_DEVICEINTERFACE_A获取的USB设备路径与MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_SYMBOLIC_LINK路径不一致的技术咨询

技术咨询:通过PDEV_BROADCAST_DEVICEINTERFACE_A获取的USB设备路径与MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_SYMBOLIC_LINK路径不一致的问题

我最近在开发一款USB摄像头的自定义控制器应用,整体拆成了两个核心模块:

  • HWDetector模块:负责监听USB摄像头的连接/断开事件。我采用了隐藏窗口+RegisterDeviceNotification的方案,通过窗口消息处理器接收设备变更通知,从PDEV_BROADCAST_DEVICEINTERFACE_A结构体中拿到设备的符号链接路径。
  • Controller模块:基于Media Foundation(MF)实现摄像头的控制逻辑。其中一个核心功能是,收到HWDetector的设备接入通知后,校验该摄像头是否支持系统配置的编码格式(比如MJPEG)。原本的思路是,把HWDetector拿到的设备路径传给Controller的校验函数,遍历MF枚举到的设备,对比路径来找到目标设备,但实际测试发现两者的路径格式完全不一致,没法直接匹配!

我的校验函数大致是这样的:

void CheckIfDeviceSupportsEncoding(const std::string &symbolicLink, EncodingEnum encoding)
{
    IMFActivate** devices = nullptr;
    UINT32 deviceCount = 0;
    HRESULT hr = MFEnumDeviceSources(nullptr, &devices, &deviceCount);
    if (SUCCEEDED(hr))
    {
        for (UINT32 i = 0; i < deviceCount; i++)
        {
            WCHAR* mfSymbolicLink = nullptr;
            hr = devices[i]->GetAllocatedString(MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_SYMBOLIC_LINK, &mfSymbolicLink, nullptr);
            if (SUCCEEDED(hr))
            {
                // 这里发现mfSymbolicLink和传入的symbolicLink格式不匹配,无法直接对比判断是否是同一设备
                CoTaskMemFree(mfSymbolicLink);
            }
            devices[i]->Release();
        }
        CoTaskMemFree(devices);
    }
}

举个例子,HWDetector拿到的路径可能是类似\\?\usb#vid_046d&pid_0825#5&32a1d28&0&2#{65e8773d-8f56-11d0-a3b9-00a0c9223196}这样的,而MF返回的路径却是\\?\usb#vid_046d&pid_0825#5&32a1d28&0&2\{e5323777-f976-4f5b-9b55-b94699c46e44}\global——两者的设备ID部分一致,但后面的GUID和后缀完全不同。

想请教各位大佬:有没有办法将这两种不同格式的路径关联起来,或者通过其中一种路径转换得到另一种?比如借助SetupAPI查询设备实例ID,再映射到MF的符号链接?

备注:内容来源于stack exchange,提问作者Brykyz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 09:29:36