【问题标题】:Why do people use ATL for COM programing?为什么人们使用 ATL 进行 COM 编程?
【发布时间】:2011-04-09 02:03:54
【问题描述】:

你能举一个例子,通过比较显示ATL的好处吗?

【问题讨论】:

    标签: com atl


    【解决方案1】:

    听起来您想要一些 ATL 简化 COM 编程的具体示例;以下是我发生的事情。

    • CComObjectRootEx:通过从 CComObjectRootEx 派生 COM 类,您可以免费获得线程安全的引用计数。

    • CComCoClass:此基类实现了用于实例化您的类的所有方法,包括客户端在您的组件中使用CoGetClassObject 所需的IClassFactory 内容。

    • COM_INTERFACE_ENTRY 宏:ATL 提供了在BEGIN_COM_MAPEND_COM_MAP 之间使用的一大堆宏,您可以使用它们以根据您的要求以正确的方式实现IUnknown::QueryInterface 的内容,无论他们可能是。

    • IDispatchImpl:如果你希望你的组件可以被脚本访问,你必须实现IDispatch。 ATL 提供了IDispatchImpl 类,省去了自己实现的麻烦。

    • CComPtr/CComQIPtr:ATL 提供了这些智能指针类,它们封装了对IUnknown::AddRefIUnknown::ReleaseIUnknown::QueryInterface 的调用。使用它们将使您的代码更易于阅读,并且不易出现 COM 引用计数错误。

    • CComBSTR/CComVariant:ATL 提供了这些类,可降低处理BSTRVARIANT COM 类型的复杂性。

    【讨论】:

    • 使用 ATL 需要包含哪些头文件/库?
    • 如果我切换到ATL,是否还需要致电CoInitialize(NULL)CoUninitialize()
    • 这听起来像是另一个问题。说真的,我并不是想无益,但是如果您在自己的页面上单独提出每个问题,这个网站会更好地为您服务。 :)
    【解决方案2】:

    开发人员很懒惰,他们更喜欢简单的事情而不是困难的事情,而 ATL 旨在使 COM 开发更容易。

    在大多数情况下,ATL 会处理 COM 开发的许多杂乱细节,例如 QueryInterface 管理、引用计数和生命周期管理,以及 COM 支持的所有各种线程模型。它还为双接口、连接点、枚举器等提供内置支持。

    如果您不使用 ATL 或类似的东西,您将编写更多代码。那将是不幸的;)

    编辑:

    作为示例,我不会编写任何没有 ATL 的 COM 代码,因为这样做太可怕了,但请查看以下内容:

    http://www.codeproject.com/KB/COM/simplecomserver.aspx

    下载它,然后查看 simplecomserver 项目下的以下文件:

    registry.cpp

    simplecomserverImpl.cpp

    (大约 700 行代码)

    现在想象一下,您可以从 CCoComClass 派生一个类并只实现 Name 方法,然后执行此操作来处理类实例化和注册,而不是编写所有这些怪物:

    // Used to determine whether the DLL can be unloaded by OLE
    STDAPI DllCanUnloadNow(void)
    {
        return _AtlModule.DllCanUnloadNow();
    }
    
    
    // Returns a class factory to create an object of the requested type
    STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
    {
        return _AtlModule.DllGetClassObject(rclsid, riid, ppv);
    }
    
    
    // DllRegisterServer - Adds entries to the system registry
    STDAPI DllRegisterServer(void)
    {
        // registers object, typelib and all interfaces in typelib
        HRESULT hr = _AtlModule.DllRegisterServer();
        return hr;
    }
    
    
    // DllUnregisterServer - Removes entries from the system registry
    STDAPI DllUnregisterServer(void)
    {
        HRESULT hr = _AtlModule.DllUnregisterServer();
        return hr;
    }
    

    【讨论】:

    • 使用ATL简化开发?
    • @wamp:假设您需要编写一个包含 20 个 COM 公开类的组件。使用 ATL,您只需从同一组模板中继承所有这些类,仅实现接口中引入的方法并将它们添加到所谓的 COM 映射中。这大约是两百行相对干净的额外代码——剩下的一切由 ATL 完成。现在尝试在没有 ATL 的情况下执行此操作 - 总有一天你会成功。
    • 如果我切换到ATL,是否还需要致电CoInitialize(NULL)CoUninitialize()
    猜你喜欢
    • 2010-11-22
    • 2012-09-09
    • 1970-01-01
    • 2011-05-16
    • 2021-08-29
    • 2011-11-11
    • 2010-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多