听起来你想要一些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::Release和IUnknown::QueryInterface.使用它们将使您的代码更易于阅读,并且不易出现COM引用计数错误.
CComBSTR/ CComVariant:ATL提供了这些类,这降低了处理BSTR和VARIANTCOM类型的复杂性.
开发人员很懒,他们更喜欢简单的事情而不是困难的事情,而 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)