聚合解释






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。