聚合实现的示意图
来源:互联网 发布:淘宝海报尺寸手机端 编辑:程序博客网 时间:2024/04/27 18:38
代码如下:
外部组件创建后,接着创建内部组件
IUnknown* pUnknownOuter = this; // this的值为&CA
CoCreateInstance(CLSID_CB,
pUnknownOuter,
CLSCTX_INPROC_SERVER,
IID_IUnknown,
(void**)&m_pUnknownInner);
m_pUnknownInner为外部组件的成员
调用下面的函数
{
IClassFactory* pIFactory = NULL;
CoGetClassObject(CLSID_IB,
CLSCTX_INPROC_SERVER,
NULL,
IID_IClassFactory,
(void**)&pIFactory);
pIFactory->CreateInstace(pUnknownOuter, iid, ppv);
}
CreateInstace(IUnknown* pUnknownOuter, const IID& iid, void** ppv)
{
//只能被IID_IUnknown接口聚合
if ((pUnknownOuter != NULL) && (iid != IID_IUnknown))
{
return CLASS_E_NOAGGREGATION ;
}
CB* pB = new(pUnknownOuter);
pB->NonQueryInterface(iid,ppv);
}
CB::NonQueryInterfacer(IID& iid, void** ppv)
{
if (iid = IID_IUnknown)
*ppv = static_cast<INonUnknown*>(this);
}
实际上CB的构造函数是这样的:
CB::CB(IUnknown* pUnknownOuter) : m_cRef(1)
{
::InterlockedIncrement(&g_cComponents) ;
if (pUnknownOuter == NULL) //不使用聚合,转换成非委托接口
{
m_pUnknownOuter = reinterpret_cast<IUnknown*>
(static_cast<INondelegatingUnknown*>
(this)) ;
}
else
{ //使用聚合 转换成外部接口
m_pUnknownOuter = pUnknownOuter ;
}
}
- 聚合实现的示意图
- 用C#实现的开发平台示意图
- COM聚合的实现
- COM聚合的实现
- com 聚合的实现
- 用于测试“红黑树算法实现的正确性”的工具示意图
- ATL 实现com的聚合
- 编程范式的示意图
- Linux内核的示意图
- 集合的完整示意图
- zookeeper的watcher示意图
- SpringBean的生命周期-示意图
- 几种链表的示意图
- 栈的初始化示意图
- 用Oracle自定义聚合函数实现字符串连接的聚合
- Oracle自定义聚合函数实现字符串连接的聚合
- 方位角的表示及示意图
- Linux内核的示意图 [摘抄]
- .NET环境下几种不同的邮件发送解决方案
- Excel Services OverView系列--3使用Excel Web Services操作Excel工作薄
- 软件开发项目-文档编写标准化--可行性分析报告
- 编码常见问题(PL/SQL和Java)
- 软件开发项目-文档编写标准化--项目开发计划
- 聚合实现的示意图
- 2,8,10,16进制转化问题
- 软件开发项目-文档编写标准化--软件需求说明书
- 《深入解析ATL》笔记(一)
- 软件开发项目-文档编写标准化--概要设计说明书
- 软件开发项目-文档编写标准化--详细设计说明书
- Mac OS X - Application's Development (1) - C++ Programming
- 软件开发项目-文档编写标准化--用户操作手册
- 中国汽车工业的发展道路