【发布时间】:2011-04-09 02:03:54
【问题描述】:
你能举一个例子,通过比较显示ATL的好处吗?
【问题讨论】:
你能举一个例子,通过比较显示ATL的好处吗?
【问题讨论】:
听起来您想要一些 ATL 简化 COM 编程的具体示例;以下是我发生的事情。
CComObjectRootEx:通过从 CComObjectRootEx 派生 COM 类,您可以免费获得线程安全的引用计数。
CComCoClass:此基类实现了用于实例化您的类的所有方法,包括客户端在您的组件中使用CoGetClassObject 所需的IClassFactory 内容。
COM_INTERFACE_ENTRY 宏:ATL 提供了在BEGIN_COM_MAP 和END_COM_MAP 之间使用的一大堆宏,您可以使用它们以根据您的要求以正确的方式实现IUnknown::QueryInterface 的内容,无论他们可能是。
IDispatchImpl:如果你希望你的组件可以被脚本访问,你必须实现IDispatch。 ATL 提供了IDispatchImpl 类,省去了自己实现的麻烦。
CComPtr/CComQIPtr:ATL 提供了这些智能指针类,它们封装了对IUnknown::AddRef、IUnknown::Release 和IUnknown::QueryInterface 的调用。使用它们将使您的代码更易于阅读,并且不易出现 COM 引用计数错误。
CComBSTR/CComVariant:ATL 提供了这些类,可降低处理BSTR 和VARIANT COM 类型的复杂性。
【讨论】:
CoInitialize(NULL) 和CoUninitialize()?
开发人员很懒惰,他们更喜欢简单的事情而不是困难的事情,而 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;
}
【讨论】:
CoInitialize(NULL) 和CoUninitialize()?