• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > 问一个com聚合的问题

问一个com聚合的问题

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了美国签证官常问问题,建筑业面试问的问题,背景调查问哪些问题,女生问男生的问题,女生问男生什么问题等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 问一个com聚合的问题
描述:

最近在看潘爱民写的《com的原理和应用》,看到第四章关于com的聚合的例子不是很明白
。例子中有两个类CompB 和CompA. 其中Comp聚合了CompA.CompA实现了ISomeInterface和
INondelegatingUnknown, ISomeInterface继承了IUnkown.
其中INondelegatingUnknown的申明如下:
class INondelegatingUnknown
{
public:
virtual HRESULT  __stdcall  NondelegationQueryInterface(const IID& iid, void 
**ppv) = 0 ;
virtual ULONG  __stdcall  NondelegatingAddRef() = 0; 
virtual ULONG  __stdcall  NondelegationRelease() = 0;
};
类CompB的类厂在创建CompB的实例的时候,调用CoCreateInstance方法(CLSID_CompA, pU
nknownOuter, CLSCTX_INPROC_SERVER, IID_IUnknown, (void **)& m_pUnknownInner)来
创建类CompA的实例。这个方法又间接调用了类厂CAFactory的CreateInstance的函数,函
数的定义如下。
HRESULT CAFactory::CreateInstance(IUnknown *pUnknownOuter, 
   const IID& iid, void **ppv)
{
HRESULT hr;
//  iid must be IID_IUnknown for aggregating 
if ( ( pUnknownOuter != NULL ) && ( iid != IID_IUnknown ) )
{
return CLASS_E_NOAGGREGATION;
}
    *ppv=NULL;
hr=E_OUTOFMEMORY;
//Create the object passing function to notify on destruction.
CA *pObj=new CA (pUnknownOuter);
if (NULL==pObj)
return hr;   
   
//Obtain the first interface pointer (which does an AddRef)
hr = pObj->NondelegationQueryInterface(iid, ppv);   
    if (hr != S_OK) {
  //Kill the object if initial creation or FInit failed.
g_CompANumber --; // Reference count g_CompANumber be added in constructor
delete pObj;
}
   
return hr;   
}
在这个函数里面,当类A的实例生成之后,调用了NondelegationQueryInterface函数查询
IID_IUnknown接口
HRESULT CA::NondelegationQueryInterface(const IID& iid, void **ppv)
{
if ( iid == IID_IUnknown )
{
*ppv = (INondelegatingUnknown *) this ;
((IUnknown *)(*ppv))->AddRef() ;   <---- Here is my question
} else if ( iid == IID_SomeInterface ) 
{
*ppv = (ISomeInterface *) this ;
((ISomeInterface *)(*ppv))->AddRef() ;
} 
else
{
*ppv = NULL;
return E_NOINTERFACE ;
}
return S_OK;
}
然后发现((IUnknown *)(*ppv))->AddRef() 这里实际调用了NondelegatingAddRef()而不
是AddRef方法(我用Visual Studio 2005跟踪调试). 不知道为什么会这样, 有没有熟悉
这本书的人或者com的人能够解释一下。


解决方案1:

INondelegatingUnknown跟IUnknown是具有相同内存结构的虚拟函数表
在组件不被聚合的时候调用的是INondelegatingUnknown的函数

解决方案2:

up

解决方案3:

INondelegatingUnknown 是从IUnknown派生的吗?它实现了AddRef吗?如果实现了,调用了NondelegatingAddRef?

解决方案4:

这是由多态决定的。估计你的A代码中INondelegatingUnknown是放在前面的。
你应该把ISomeInterface放在前面。这样你调用addref就不会发生这种情况。
---------
//Obtain the first interface pointer (which does an AddRef) 
hr = pObj->NondelegationQueryInterface(iid, ppv);  
    if (hr != S_OK) { 
---------这就是就是访问第一个继承的接口,实际上,他误认为你的INondelegatingUnknown为ISomeInterface。
一家之言。


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 再问个简单的问题,在线等!!!!
  • 问一个比较初级的问题,谢谢!
  • 问个com使用的问题
  • 问一个问题,请大家帮帮忙啊。
  • 问个打包加密问题。
  • 问一个COM聚合的问题
  • 问一个简单的嵌入flash问题
  • 问一个很简单分又高的问题
  • 问一个com聚合的问题

相关文章

  • 2017-06-05 多线程问题,
  • 2017-06-05 鼠标HOOK的问题
  • 2017-06-04 wtcdialogimpl对话框的调用
  • 2017-06-05 在vs2008中添加一个IDispatch的借口
  • 2017-06-04 VS2005编译vs2002程序出错
  • 2017-06-05 求助,WebBrowser定制,SetUIHandler失败
  • 2017-06-04 wmp的ocx控件如何去可视化效果?
  • 2017-06-05 新年上班第一天的问题:IActiveDesktop的GetWallpaper获取的路径怎么不正确
  • 2017-06-04 QQ图文发送方式?可否将OCX控件当作OLE对象插入CRichEditCtrl?ADO如何读取XML中的记录集?寻求技术高人请进
  • 2017-06-05 进程间通讯问题小弟很菜啊,请大侠指教,解决问题后马上结帖给分)

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 一个关于多线程数据通讯同步的问题
    • 请教SAFEARRAY的使用
    • ???“应用程序标识”与“模拟级别”有什么区别???
    • VC开发的ACTIVX控件,怎么在VB里面不能用啊?应该注意什么问题呢?
    • 还是insideCOM
    • 关于FARPROC的定义
    • 求ATL下使用trackbar控件的实例
    • 请问高手关于取桌面图标的坐标的问题
    • 急急!MFC项目中在对话框中插入一个系统内建组件,为什么生成的html脚本文件在IE浏览器中不显示此组件
    • 请问下有没有c++操作pdf的类库?

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有