【问题标题】:Calling a custom COM interface from a ATL project从 ATL 项目调用自定义 COM 接口
【发布时间】:2011-06-10 04:08:46
【问题描述】:

如何从 ATL 项目调用 COM 接口?

我按照http://www.codeproject.com/KB/COM/comintro.aspx 的示例进行操作,但他们使用了在 wininet.h 中定义的 IActiveDesktop 类。如何在没有接口定义的情况下调用自定义组件。我如何生成它?

在 MFC 项目中,我可以从 TypeLib 生成 MFC 类。但是我必须做什么才能从 ATL 项目中的 TypeLib 生成我的标头?

【问题讨论】:

    标签: c++ visual-studio-2008 visual-c++ com atl


    【解决方案1】:

    如果您要调用第三方 COM 组件,则不需要为该组件提供接口定义文件 (.idl)。使用 CComPtr ATL 类,它封装了用于任何 COM 对象的典型事情,例如 CoCreateInstance 和 QueryInterface。还有一个 IDispatch 的模板特化,使 CComPtr 与 ActiveX 控件一起使用特别容易。

    CComPtr p;
    static CLSID id = { 0xcf9904f7, 0x8623, 0x465b, { 0xa0, 0x5e, 0x9d, 0x5a, 0xa, 0x2c, 0x1a, 0xe7 } }; 
    p.CoCreateInstance(id);
    

    【讨论】:

    • 可以通过接口调用函数,而不是通过IDispatch进行路由。
    • 你能举个小例子吗?对于 QueryInterface 我必须有一个 GUID 和接口定义。我从哪里获得第三方 dll 的接口定义?
    • @Jan:你不需要接口定义本身,你只需要接口的文档,这样你就可以知道接口上有哪些方法可用。确保您的组件在机器注册表中正确注册。
    • @Jan:我明白你现在在问什么。该代码项目示例实际上不是 ATL 项目。它使用本机 C++ COM API。 ATL 是一个围绕这些 API 构建的庞大的面向对象框架。不管。调用 COM 对象有两种基本方法。您可以使用 IDispatch.Invoke,也可以直接使用从 CoCreateInstance 获得的接口指针(有时您可以同时使用两者)。在后一种情况下,是的,您确实需要一个定义接口上的方法的标头。 header 实际上并不是一个 idl,header 通常是从 idl 生成的。
    • 如果你没有header或者idl,那么你必须使用IDispatch。许多第三方 activex 控件设置为使用 IDispatch 并且不提供 C++ 头文件。事实上,大多数控件根本就不会从 C++ 中调用。
    猜你喜欢
    • 2010-12-03
    • 2013-09-08
    • 2011-04-28
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    相关资源
    最近更新 更多