枚举机器上所有 IDispatch 实现对象

Posted

技术标签:

【中文标题】枚举机器上所有 IDispatch 实现对象【英文标题】:Enumerating all IDispatch implementing objects on a machine 【发布时间】:2009-11-18 14:06:16 【问题描述】:

我想列举一台机器上所有支持 IDispatch 的对象。目前我需要知道类 id 或 prog id 是什么,但是为了检查我的机器,我想知道我是否可以枚举所有实现 IDispatch 的对象。

这可能吗?

任何帮助将不胜感激:)

【问题讨论】:

【参考方案1】:

这是一个非常奇怪的要求。问题在于“全部”规定。通过 HKCR\Typelib 键和 LoadTypeLib() 进行简单枚举是不够的,不需要 COM 服务器来发布类型库。您实际上必须 CoCreateInstance() 用于 IDispatch 的 coclass 和 QueryInterface。这不仅慢,而且有风险。

如果你解释一下为什么你实际上会考虑做这样的事情,你可能会得到一个更好的答案。在不知道参数的含义或副作用可能是什么的情况下调用 IDispatch::Invoke() 是灾难的根源。远离诸如“ReformatDrive”之类的方法名称。

【讨论】:

在寻找 IDispatch 实现方面确实有点学术练习。除其他事项外,我有兴趣查看可用的内容,或者严重或未记录的内容。我希望你可以创建一个 IEnum*,来找到它们。我假设 ClassID 都在注册表中,或者这不是,一定是这种情况...... 我应该补充一点,我非常清楚我可能会意外释放的破坏,但同样,我非常清楚这样做可以获得的力量......

以上是关于枚举机器上所有 IDispatch 实现对象的主要内容,如果未能解决你的问题,请参考以下文章

.NET 6 IDispatch 客户端实现崩溃

LPDISPATCH是啥数据类型,他和IDispatch有啥关系

IDispatch::Invoke(DISPATCH_PROPERTYGET) 是不是会增加返回的 IDispatch 接口上的引用计数?

对于进程间 COM 对象,在不使用 QueryInterface 的情况下将 IDispatch* 转换为 IUnknown* 是不是安全?

通过 CComPtr<IDispatch> Invoke 检索数组

使用 IDispatch 的 C++ 和 COM 的类似动态的替代方案