WEB开发网
开发学院软件开发VC 组件对象模型与ATL实现 阅读

组件对象模型与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)

第三步 把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集合类。

上一页  2 3 4 5 6 7 8 9 10 11 12  下一页

Tags:组件 对象 模型

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接