给定一个ActiveX控件的实例,我该如何枚举它的接口? (我想得到接口的名称)。
答案 0 :(得分:4)
与其他人提到的一样,唯一的方法是QueryInterface用于所有可能的接口。这正是Microsoft工具OleView为您所做的。
答案 1 :(得分:3)
不幸的是,这不是COM的目的。在基本COM级别,您只能ask an object whether it supports一个特定的UUID标识的接口,一次一个。由于有很多潜在的UUID,因此获得详尽的列表需要花费相当多的时间!虽然大多数对象实现将在内部跟踪支持的接口列表,但是没有标准的COM方法从外部访问这些列表。即使有,你也只能通过在注册表中查看他们的UUID来获得接口的程序化名称,这并不总是可靠的。
ActiveX objects (a tricky term!)倾向于通过IDispatch
支持自动化。如果对象表现良好,您将能够get some information on the methods通过GetTypeInfo()
支持这些对象。此不会包含方法所属的接口名称(如果有)。
总而言之,COM在对象元数据方面相当差。
答案 2 :(得分:1)
没办法。 COM接口背后的想法是你问对象 - “如果你支持它,请给我接口XYZ”并且对象决定如何响应 - 提供对自身的引用或暴露某些内部对象的接口等。所以你可以'知道对象“支持”的接口,而不是如上所述询问对象。这是COM设计者的设计决定。