组件对象模型与ATL实现
2010-09-04 20:48:02 来源:WEB开发网第三步 把Shapes变成集合对象
修改后的完整的Shapes.h为:
// Shapes.h : CShapes 的声明
#pragma once
#include "resource.h" // 主符号
#include "MapLib.h"
#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
#error "Windows CE 平台(如不提供完全DCOM 支持的Windows Mobile 平台)上无法正确支持单线程COM 对象。定义_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA 可强制ATL 支持创建单线程COM 对象实现并允许使用其单线程COM 对象实现。rgs 文件中的线程模型已被设置为“Free”,原因是该模型是非DCOM Windows CE 平台支持的唯一线程模型。"
#endif
#include "Shape.h"
typedef CComEnumOnSTL<IEnumVARIANT, &IID_IEnumVARIANT, VARIANT,
_CopyVariantFromAdaptItf<IShape>,
vector< CAdapt< CComPtr<IShape> > > >
CComEnumVariantOnArrayOfShapes;
typedef ICollectionOnSTLImpl<IDispatchImpl<IShapes, &IID_IShapes>,
vector< CAdapt< CComPtr<IShape> > >,
IShape*,
_CopyItfFromAdaptItf<IShape>,
CComEnumVariantOnArrayOfShapes>
IShapesCollImpl;
// CShapes
class ATL_NO_VTABLE CShapes :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CShapes>, // OLD: public CComCoClass<CShapes, &CLSID_Shapes>,
// non-createable,去掉注册表项
public ISupportErrorInfo,
// public IDispatchImpl<IShapes, &IID_IShapes, &LIBID_MapLibLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
public IShapesCollImpl
{
public:
CShapes()
{
}
// DECLARE_REGISTRY_RESOURCEID(IDR_SHAPES)
DECLARE_NO_REGISTRY() // non-createable,去掉注册表项
BEGIN_COM_MAP(CShapes)
COM_INTERFACE_ENTRY(IShapes)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(ISupportErrorInfo)
END_COM_MAP()
// ISupportsErrorInfo
STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);
DECLARE_PROTECT_FINAL_CONSTRUCT()
HRESULT FinalConstruct()
{
return S_OK;
}
void FinalRelease()
{
}
public:
};
OBJECT_ENTRY_AUTO(__uuidof(Shapes), CShapes)
接下来,修改“MapLib.idl”文件的IShapes部分,使其如下所示:
interface IShapes : IDispatch{
[propget,helpstring("Shape元素数目")] HRESULT Count([out,retval] long *nItems);
[id(DISPID_VALUE),propget,helpstring("取得指定索引的Shape元素。索引以为基数")]
HRESULT Item([in] long index, [out,retval] IShape** ppRef);
[id(DISPID_NEWENUM),propget,hidden] HRESULT _NewEnum([out,retval] IUnknown** ppEnum);
// [id(1),helpstring("向集合增加一个元素,返回引用")] HRESULT Add([out,retval] IShape** ppRef);
};
到此,整个集合的架构建立起来了。其中Layers集合是基于STL的list,而Shapes是基于STL的vector。用户可以根据自己要实现的模型的特点,选择使用适合的STL集合类。
更多精彩
赞助商链接