为什么人们使用ATL进行COM编程?

wam*_*amp 6 com atl

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

Phi*_*oth 7

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

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

  • CComCoClass:此基类实现了实例化类的所有方法,包括IClassFactory客户端CoGetClassObject与组件一起使用所需的内容.

  • COM_INTERFACE_ENTRY宏:ATL提供了一大堆宏来在BEGIN_COM_MAP和之间使用END_COM_MAP,你可以用它们以IUnknown::QueryInterface正确的方式实现你的需求,无论它们是什么.

  • IDispatchImpl:如果希望脚本可以访问组件,则必须实现IDispatch.ATL提供了这个IDispatchImpl课程,省去了自己实现它的麻烦.

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

  • CComBSTR/ CComVariant:ATL提供了这些类,这降低了处理BSTRVARIANTCOM类型的复杂性.

  • 这听起来像另一个问题.说真的,我并不是没有帮助,但是如果你在自己的页面上分别提出每个问题,这个网站会更好地为你工作.:) (3认同)

Ger*_*ald 3

开发人员很懒,他们更喜欢简单的事情而不是困难的事情,而 ATL 的设计就是为了让 COM 开发变得更容易。

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

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

编辑:

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

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

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

注册表.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;
}
Run Code Online (Sandbox Code Playgroud)