你如何比较两个任意的 COM 对象(你能得到任意对象的 CLSID 吗?)
how do you compare two arbitrary COM objects (can you get CLSID for arbitrary object?)
我正在 COM 中实现一些东西,我在其中新建了一些对象(在本例中为 FilterGraph IFilters),每次我新建另一个对象时,我想遍历之前的列表并查看我是否是即将添加的是 "already on the graph"(已在列表中)。我的第一个想法是只使用指针相等(没有用)。然后我想通过CLSID来比较。
有没有办法从 "arbitrary" 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 的父级 class IPersist 有一个我可以使用的 GetClassID 方法,但出于好奇,是否有更通用的方法。 ..)
CLSID
告诉对象 class ("type") COM 对象,尤其是。您可以与 CoCreateInstance
一起使用的标识符来创建相同 class 对象的另一个实例。
比较 non-null 个 CLSID,您可以看出对象是相同的 class,但这并不一定意味着这些对象可以互换。有时您也可以枚举 public 属性并比较它们,但这对于任意对象仍然不是可靠的方法。
特别是对于 DirectShow API,使用 CoCreateInstance
实例化的已注册过滤器通常会报告唯一的 CLSID。然而,使用名字对象(设备、压缩器)创建的那些更愿意共享 CLSID 并且 per-initialized 以使用特定资源,并且具有相同标识符的过滤器不一定 "equal".
我正在 COM 中实现一些东西,我在其中新建了一些对象(在本例中为 FilterGraph IFilters),每次我新建另一个对象时,我想遍历之前的列表并查看我是否是即将添加的是 "already on the graph"(已在列表中)。我的第一个想法是只使用指针相等(没有用)。然后我想通过CLSID来比较。
有没有办法从 "arbitrary" 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 的父级 class IPersist 有一个我可以使用的 GetClassID 方法,但出于好奇,是否有更通用的方法。 ..)
CLSID
告诉对象 class ("type") COM 对象,尤其是。您可以与 CoCreateInstance
一起使用的标识符来创建相同 class 对象的另一个实例。
比较 non-null 个 CLSID,您可以看出对象是相同的 class,但这并不一定意味着这些对象可以互换。有时您也可以枚举 public 属性并比较它们,但这对于任意对象仍然不是可靠的方法。
特别是对于 DirectShow API,使用 CoCreateInstance
实例化的已注册过滤器通常会报告唯一的 CLSID。然而,使用名字对象(设备、压缩器)创建的那些更愿意共享 CLSID 并且 per-initialized 以使用特定资源,并且具有相同标识符的过滤器不一定 "equal".