组件对象模型与ATL实现
2010-09-04 20:48:02 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁惧墽鎳撻—鍐偓锝庝簻椤掋垺銇勯幇顖毿撻柟渚垮妼椤粓宕卞Δ鈧獮濠勭磽閸屾艾鈧懓顫濋妸鈺佺疅缂佸顑欓崥瀣煕椤愵偅绶氱紓鍐╂礋濮婂宕掑▎鎴М濠电姭鍋撻梺顒€绉甸幆鐐哄箹濞n剙濡肩紒鎰殜閺屸€愁吋鎼粹€茬敖婵炴垶鎸哥粔鐢稿Φ閸曨垰鍐€妞ゆ劦婢€濞岊亪姊虹紒妯诲蔼闁稿海鏁诲濠氭晲婢跺﹤宓嗛梺缁樺姈缁佹挳宕戦幘璇叉嵍妞ゆ挻绋戞禍鐐叏濡厧浜鹃悗姘炬嫹

添加实现代码到Canvas.h中,你只需注意加粗的文字:
#include "Layers.h"
// CCanvas
class ATL_NO_VTABLE CCanvas :
public CComObjectRootEx<CComSingleThreadModel>,
...
{
public:
CComPtr<ILayers> m_spLayers;
CCanvas()
{
m_bWindowOnly = TRUE; // 必须:总是创建自己的窗口
}
...
HRESULT FinalConstruct()
{
return CLayers::CreateInstance(&m_spLayers);
// return S_OK;
}
void FinalRelease()
{
}
public:
STDMETHODIMP CCanvas::get_Layers(ILayers** ppRef)
{
return m_spLayers.CopyTo(ppRef);
}
// 此方法在Canvas.cpp中实现,以避免交叉引用头文件
// STDMETHOD(CreateObject)(BSTR bstrObjName, IDispatch** ppOutObj);
};
在Canvas.cpp中,CreateObject可以如下实现:
// Canvas.cpp : CCanvas 的实现
#include "stdafx.h"
#include "Canvas.h"
// CCanvas
#include "Layers.h"
#include "Layer.h"
#include "Shapes.h"
#include "Shape.h"
/*
STDMETHODIMP CCanvas::CreateObject(BSTR bstrObjName, IDispatch** ppOutObj)
{
if (!bstrObjName || !ppOutObj)
return E_POINTER;
if (wcsicmp(bstrObjName, "layers")==0)
{
CComPtr<ILayers> spOut;
CLayers::CreateInstance(&spOut);
if(spOut)
return spOut->QueryInterface(IID_IDispatch, (void**)ppOutObj);
}
else if (wcsicmp(bstrObjName, "layer")==0)
{
CComPtr<ILayer> spOut;
CLayer::CreateInstance(&spOut);
if(spOut)
return spOut->QueryInterface(IID_IDispatch, (void**)ppOutObj);
}
else if(wcsicmp(bstrObjName, "shapes")==0)
{
CComPtr<IShapes> spOut;
CShapes::CreateInstance(&spOut);
if(spOut)
return spOut->QueryInterface(IID_IDispatch, (void**)ppOutObj);
}
else if(wcsicmp(bstrObjName, "shape")==0)
{
CComPtr<IShape> spOut;
CShape::CreateInstance(&spOut);
if(spOut)
return spOut->QueryInterface(IID_IDispatch, (void**)ppOutObj);
}
return E_INVALIDARG;
}
*/
更多精彩
赞助商链接