如何在 C++ 中单独给定 ProgID 来实例化 class?
How would one instantiate a class given a ProgID alone in C++?
假设我有一个 progid Prog.Class。在 powershell 之类的东西中,这足以做事
$obj = New-Object -COM "Prog.Class"
$obj.method();
不过在 C++ 中,我需要知道支持的接口
CoCreateInstance(CLSIDFromProgID(...),...,IID_SomeInterface,...)
我如何在 C++ 中只知道 progid 而不知道接口 ID 来解决这个问题?有没有办法获取可能的接口 ID?我可以做类似 CoCallMethodOnClass(...) 的事情吗?
Powershell 使用 IID_IDispatch 获得 IDispatch*。支持后期绑定的接口,很多COM服务器都实现了。
C++ 在其语言语法中不支持后期绑定,这确实使它变得更加痛苦。您必须调用 IDispatch::GetIDsOfNames() 将成员名称 "method" 转换为 DispId,IDispatch::Invoke() 才能调用它。
据我所知,无法获得支持的 IID 列表,但如果您没有相关接口的 C++ 类型信息(什么你打算单独使用 IID 吗?)。
但是,通过使用 IDispatch 接口,仍然可以在不知道其接口的情况下使用 COM 对象。 IDispatch 包含用于根据方法名称或 DISPID 调用对象方法的方法。这称为后期绑定,与早期绑定相反,早期绑定是根据有关接口的编译时信息调用方法。
当然,在 C++ 中,最好使用早期绑定,因为使用 IDispatch 需要大量 C++ 无法自动执行的样板代码。后期绑定主要用于与动态类型的语言或可以通过其他方式受益于后期绑定的语言的互操作性,例如 "old" VB 或 Powershell.
假设我有一个 progid Prog.Class。在 powershell 之类的东西中,这足以做事
$obj = New-Object -COM "Prog.Class"
$obj.method();
不过在 C++ 中,我需要知道支持的接口
CoCreateInstance(CLSIDFromProgID(...),...,IID_SomeInterface,...)
我如何在 C++ 中只知道 progid 而不知道接口 ID 来解决这个问题?有没有办法获取可能的接口 ID?我可以做类似 CoCallMethodOnClass(...) 的事情吗?
Powershell 使用 IID_IDispatch 获得 IDispatch*。支持后期绑定的接口,很多COM服务器都实现了。
C++ 在其语言语法中不支持后期绑定,这确实使它变得更加痛苦。您必须调用 IDispatch::GetIDsOfNames() 将成员名称 "method" 转换为 DispId,IDispatch::Invoke() 才能调用它。
据我所知,无法获得支持的 IID 列表,但如果您没有相关接口的 C++ 类型信息(什么你打算单独使用 IID 吗?)。
但是,通过使用 IDispatch 接口,仍然可以在不知道其接口的情况下使用 COM 对象。 IDispatch 包含用于根据方法名称或 DISPID 调用对象方法的方法。这称为后期绑定,与早期绑定相反,早期绑定是根据有关接口的编译时信息调用方法。
当然,在 C++ 中,最好使用早期绑定,因为使用 IDispatch 需要大量 C++ 无法自动执行的样板代码。后期绑定主要用于与动态类型的语言或可以通过其他方式受益于后期绑定的语言的互操作性,例如 "old" VB 或 Powershell.