65.9K
CodeProject 正在变化。 阅读更多。
Home

聚合解释

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.88/5 (11投票s)

2007 年 2 月 1 日

2分钟阅读

viewsIcon

47559

downloadIcon

577

解释实现 COM 组件之间聚合关系步骤的文章。

Sample image

引言

让我们了解一下重用技术“聚合”,以及如何在 COM 中实现它。

定义

在这种重用机制中,外部 COM 直接将内部 COM 的接口暴露给客户端。我将尝试以最简单的方式解释实现内部 COM 和外部 COM 之间聚合关系所涉及的步骤,以便 COM 初学者能够理解和实践。

让我们以一个例子来建立计算器组件(内部 COM)与 ComplexCalculator(我们现在要构建)之间的聚合关系。计算器组件已经可用。

从源代码中下载 Calculator.dll 并注册它。

步骤

  • 创建一个类型为 Atl COM 的新项目,命名为 ComplexCalculator 并选择类型为“dll”。
  • 插入一个新的 Atl 对象,选择简单对象选项并命名为 ComplexMath
  • IComplexMath 接口添加一个新的方法。

方法名称:Divide

参数:[in] int x, [in] int y, [out, retval] int* z

添加以下代码

STDMETHODIMP CComplexMath :: Divide (int x, int y, int *z)
{
    *z= x/y;

    return S_OK;
}

CalculatoeEx.idl 进行以下更改

Calculator.idl 的对象部分和接口部分复制到 ComplexCalculator.idl

[
    object,
    uuid(1E48B0F0-010D-4658-A0B6-70300FDA56F1),
    dual,
    helpstring("ISimpleMath Interface"),
    pointer_default(unique)

]

    interface ISimpleMath : IDispatch
    {
        [id(1), helpstring("method Add")] 
            HRESULT Add([in] int x, [in] int y,    
            [out, retval] int* z );
    };

ComplexCalculator.idlcoclass 部分,添加我们要聚合的接口名称。

注意:需要进行更改的部分以**粗体**标出。

coclass ComplexMath
{
    [default] interface IComplexMath;
    interface ISimpleMath;
};

ComplexCalculator.h 进行以下更改

SimpleMath 的 CLSID 从 Calculator_i.c 复制到 ComplexCalculator.h

const CLSID CLSID_SimpleMath = {0xF58218E0,0x645A,0x473D,
                               {0x84,0x4B,0x30,0x78,0x65,
                                0x03,0x8D,0x9E}};

对 COM MAP 进行以下更改

注意:需要进行更改的部分以**粗体**标出。

BEGIN_COM_MAP(CComplexMath)
    COM_INTERFACE_ENTRY (IComplexMath)
    COM_INTERFACE_ENTRY_AGGREGATE (IID_ISimpleMath, ptrUnk)
    COM_INTERFACE_ENTRY (IDispatch)
END_COM_MAP () 

添加以下宏,finalconstructrelease 方法

DECLARE_GET_CONTROLLING_UNKNOWN()
IUnknown* ptrUnk;

HRESULT FinalConstruct()
{
    return CoCreateInstance(CLSID_SimpleMath,
            GetControllingUnknown(),CLSCTX_ALL, 
            IID_IUnknown, (void**)&ptrUnk);
}

void FinalRelease()
{
    ptrUnk->Release();
}

在源代码中搜索“Aggregation”以找到用于构建“Calculator”和“ComplexCalculator”之间关系的代码。

注意:在使用演示项目之前,请注册 Calculator.dllComplexCalculator.dll

© . All rights reserved.