【发布时间】:2016-01-05 22:10:52
【问题描述】:
我在 COM 中实现了一些东西,我在其中新建了一些对象(在这种情况下为 FilterGraph IFilters),每次我新建另一个对象时,我想遍历前一个列表,看看我是否要add 是“已经在图表上”(已经在列表中)。我的第一个想法是只使用指针相等(没有用)。然后我想通过CLSID进行比较。
有没有办法从“任意”COM 对象中获取 CLSID?
我能找到的最接近的是:从显示名称的子字符串中更新 guid
Problems accessing the Running Object Table
和what is CLSID of COM object I just ran in Visual Basic(它使用 CreateObject,但我使用的是 EnumMoniker 而不是 CreateObject)。
(作为说明,我发现 IBaseFilter/IMediaFilter 的父类 IPersist 有一个可以使用的 GetClassID 方法,但为了好奇,有没有更通用的方法...)
【问题讨论】:
-
我很困惑。您说您刚刚创建了一个全新的对象 - 同一个对象怎么可能已经存在于您的列表中?它是否及时返回?至于获取
CLSID- 是的,您查询IPersist的接口指针并调用GetClassID。如果对象没有实现IPersist,那么你很不幸(并不是每个 COM 对象都有一个与之关联的CLSID)。 -
@IgorTandetnik 在这种情况下,它似乎是例如捕获过滤器的“新实例化”。所以一个代表相同物理捕获设备的“捕获过滤器”,但我已经实例化了两次,我想这是可能的。从本质上讲,我正在尝试检测两个过滤器是否“是相同的捕获设备”FWIW。
-
我对 DirectX 一点也不熟悉。我会想象一个表示物理设备的 COM 对象将提供一种获取名称或 ID 或标识该设备的东西的方法。然后,您将从两个对象中检索这些 ID,并进行比较。没有通用的“这两个任意 COM 对象是否代表相同的物理项目”检查,如果仅仅是因为 COM 对象通常不代表物理项目。您似乎期待针对特定领域问题的通用解决方案;我不认为这是一个合理的期望。
标签: com directshow equality