聚合解释






3.88/5 (11投票s)
2007 年 2 月 1 日
2分钟阅读

47559

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

引言
让我们了解一下重用技术“聚合”,以及如何在 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.idl 的 coclass 部分,添加我们要聚合的接口名称。
注意:需要进行更改的部分以**粗体**标出。
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 () 
添加以下宏,finalconstruct 和 release 方法
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.dll 和 ComplexCalculator.dll。
