描述:
问题1:
我在看com原理与应用的第四张,关于聚合书上源程序是这样
HRESULT CB::Init()
{
IUnknown *pUnknownOuter = (IUnknown *)this;
HRESULT result = ::CoCreateInstance(CLSID_CompA, pUnknownOuter,
CLSCTX_INPROC_SERVER,
IID_IUnknown, (void **)& m_pUnknownInner) ;
if (FAILED(result))
return E_FAIL;
result = m_pUnknownInner->QueryInterface(IID_SomeInterface, (void **)&m_pSomeInterface);*******************************
if (FAILED(result))
{
m_pUnknownInner->Release();
return E_FAIL;
}
pUnknownOuter->Release();
return S_OK;
}
哥哥们看*******************************局书上说在请求ISomeInterface接口时外部对象引用记数加一而不是内部对象的引用对象加一,所以创建完要用外部对象release恢复引用记数,
我晕的是m_pUnknownInner获得是内部对象呀!怎么书上书上说在请求ISomeInterface接口时外部对象引用记数加一而不是内部对象的引用对象加一
pUnknownOuter->Release();这局更是晕!
2。我知道dll是封装com的一个容器,可我怎么把我的com程序作成dll的形式呢?书上给的例程都是已经作成dll形式了,它讲的vc++开发和ATL又很简单,我看了半天也没看个所以然来。还望那位大哥赐教!小弟笑脸奉上100分酬谢!
解决方案1:
上面那段代码的意思大致是这样的:
CB是外部组件的实现类,在被new出来之后,类厂会调用其Init函数,以给他一个初始化的机会。CB把自己的指针传给内部组件表示希望聚合,如果成功,则CB还会查询它希望聚合的接口是否存在,也就是:
result = m_pUnknownInner->QueryInterface(IID_SomeInterface, (void **)&m_pSomeInterface);*******************************
这个调用将会导致内部组件的一个AddRef调用,但实际上这个AddRef被转发给了外部组件,所以,后面的代码会在不成功时释放内部组件,而在成功时调用自己的Release以减少这个多出来的计数。这个Release是必需的,否则外部组件的引用计数就再也不会为0了。
仔细看一看内部组件的实现是如何来支持聚合的就明白了。
您可能想查找下面的文章:
- 关于获取Windows消息问题,请赐教!!!在线等待
- 推荐几本好的ATL入门的书籍,由浅到深的,望不吝赐教
- 关于Hook到Word函数的问题有点难度,请救急,PM在催了!!!请蒋晟不吝赐教!!
- 如何编写基于文档/视图结构的ActiveX控件?请高手们不吝赐教,谢谢了
- 望高手们不吝赐教ocx播放器
- 我想要BasicExcel_srczip和BasicExcel_demo,请赐教
- 有关读写串口的问题,请各位赐教!
- 如何在自己的窗扣内载入并且显示一个ppt文件内容??谢谢赐教!
- 在线求问一个串口收发的问题,小弟分少,望大侠不吝赐教!
- ATL复合控件上的Static控件,如何改变背景色。。。没分了。。。希望大家不吝赐教