如何在C ++中单独使用ProgID实例化一个类?

时间:2015-07-17 23:54:15

标签: c++ com

说我有一个progid Prog.Class。在PowerShell之类的东西中,这就足以做事了




  $ obj = New-Object -COM“Prog.Class”
 $ obj.method ();
  




在C ++中,我需要知道支持的接口

&#xA;&#xA; < pre> CoCreateInstance(CLSIDFromProgID(...),...,IID_SomeInterface,...)&#xA; &#xA;&#xA;

我如何用C ++知道只有progid而不是接口ID?有没有办法获得可能的接口ID?我可以做一些像CoCallMethodOnClass(...)吗?

&#xA;

2 个答案:

答案 0 :(得分:2)

Powershell使用IID_IDispatch获取IDispatch*。支持后期绑定的接口,许多COM服务器实现它。

C ++不支持其语言语法中的后期绑定,这确实使它变得更加痛苦。您必须调用IDispatch :: GetIDsOfNames()将成员名称“method”转换为DispId,IDispatch :: Invoke()来调用它。

答案 1 :(得分:1)

据我所知,无法获取受支持的IID列表,但如果您没有相关接口的C ++类型信息,那么知道IID就没有用了(你是什么人)仅仅与IID有关吗?)。

但是,通过使用IDispatch接口,仍然可以在不知道其接口的情况下使用COM对象。 IDispatch包含基于方法名称或DISPID调用对象方法的方法。这称为后期绑定,而不是早期绑定,您可以根据有关接口的编译时信息调用方法。

当然,在C ++中,最好使用早期绑定,因为使用IDispatch需要许多C ++不能自动化的样板代码。后期绑定主要用于与动态类型的语言进行互操作,或者可以通过其他方式从后期绑定中获益,例如“旧”VB或Powershell。