【问题标题】:How can I detect all interfaces a COM object implements?如何检测 COM 对象实现的所有接口?
【发布时间】:2010-12-17 21:46:50
【问题描述】:

消费者有没有办法枚举给定 COM 对象实现的所有接口?

【问题讨论】:

    标签: windows com


    【解决方案1】:

    Dependency Walker 可能会为您完成这项工作...

    http://theircorp.byethost11.com/index.php?vw=TypeLib 是检查 TBL 文件的免费工具。

    【讨论】:

    • Dependency Walker 有这方面的功能吗?
    【解决方案2】:

    Dependency Walker 不会显示接口,因为唯一的导出是 DllGetClassObject、DllRegisterServer 等(对于 DLL 托管的 COM)。

    正如 weismat 所说,您可以检查 TLB 文件。许多 COM 对象在可执行文件的资源部分包含嵌入的类型库。使用资源黑客等工具,您可以提取 TLB 并使用 LoadTypeLib COM 函数来获取指向 ITypeLib 接口的指针(当然,您可以将 LoadTypeLib/LoadTypeLibEx 直接与 COM 或 EXE DLL 一起使用)。

    使用此接口,您可以迭代其中包含的类型。

    【讨论】:

    • 不过,评估 TLB 的内容不会公开有关 COM 对象可能正在使用的任何私有接口的信息。
    • 从 exe/dll 打开类型库使用github.com/tyranid/oleviewdotnet
    【解决方案3】:

    如果您只是想知道消费者可以调用哪些方法,可以尝试 IDispatch/IDispatchEx。

    在 COM 中,IUnknown 上的 QueryInterface 方法不需要公开它可能返回的接口。你根据它的 IID 要求一个,你要么得到它,要么没有。 QI 在特定 COM 对象中的实现差异很大,尽管它应该遵循 Microsoft 在此处描述的模式 - http://msdn.microsoft.com/en-us/library/ms682521%28VS.85%29.aspx

    【讨论】:

    • 如果没记错的话,使用 IDispatch/IDispatchEx 您将在 IDL 中捕获具有 oleautomation 属性的接口。
    猜你喜欢
    • 2017-09-11
    • 2021-12-27
    • 1970-01-01
    • 2011-07-06
    • 2014-06-16
    • 2011-01-12
    • 1970-01-01
    • 2010-10-20
    相关资源
    最近更新 更多