• 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 > ATL类为什么不能用newCInterfaceA得形式实例化?!报纯虚函数QueryInterface没有定义

ATL类为什么不能用newCInterfaceA得形式实例化?!报纯虚函数QueryInterface没有定义

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

佚名通过本文主要向大家介绍了ATL类为什么不能用newCInterfaceA得形式实例化?!报纯虚函数QueryInterface没有定义等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: ATL类为什么不能用new CInterfaceA得形式实例化?!报纯虚函数QueryInterface没有定义
描述:

可ATL类是从CComObjectRootEx<CComSingleThreadModel>继承而来得就是已经实现QueryInterface,AddRef,Release()了这些纯虚函数啊
那位知道原因?感谢


解决方案1:

看来还得多说两句
不要把com类局限在c++上,CreateInstance之于COM类相当于new之于C++类,c++做得COM类可以使用new CComObject<yourclass>,但是,并不规范,因为即使是c++做得COM类,new也不能保证生成完备的类实例,比如聚合了其他组件或使用了特殊的动态接口技术,子类(或兄弟类)的实例无法生成,有人可能觉得只要在构造函数中做一些处理就可以解决问题,但是如果你的类是个全局实例且没有使用CRT支持,则类的构造函数将无法被调用,为了解决这个问题,ATL使用了多步构造的方法,将类的初期处理放在成员函数FinalConstruct()中,并使用CComCreator代替new,CreateInstance会使用以上技术,所以保证了任何情况下的正确性。

解决方案2:

CInterfaceA是抽象类,因为它还没有实现QueryInterface,AddRef,Release()这些纯虚函数,不信的话可以看看CComObjectRootEx的源代码,只是说在CComObjectRootEx中已经有了实现QueryInterface,AddRef,Release()这些纯虚函数的东西了,真正的实现是在CComObject中实现的。如果真的想用pObj->m_bstrName这样的做法,直接yourclass * pclassinstance = new CComObject<yourclass>就可以了。

解决方案3:

简单问题,却说了这么多废话,一般地,如果你的组件类没有涉及Aggregation的话,可以这么做:
typedef CComObject<CInterfaceA> CIAObject;
CIAObject *pCls=new CIAObject;
或者:
IInterfaceA * pObj = NULL;
CComObject<CInterfaceA>::CreateInstance( &pObj );
CIAObject *pCls=(CIAObject*)pObj;
至于为什么不能实例化CInterfaceA呢?它的确是个抽象基类,所有ATL工程生成的组件类都是抽象基类,它们没有实现IUnknown相关的几个函数,这些函数是由CComObject,CComAggObject(处理与Aggregation相关的组件类)等模板类实现的,它们的模板参数就是自定义的组件类。

解决方案4:

我读了N遍ATL 技术内幕,因为你的内是抽象类,它的基类提供了多种辅助实现(注意不是实现),但我们的类没有相应的实现,必须由我们的类的派生类来实现,例如CCOMOBJECT<CINTERFACEA>,就是一个具像类,你可以对它NEW.


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

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

相关文章

  • 2017-06-05 一个线程的编译错误
  • 2017-06-05 怎样在程序里改变本进程的优先级别?
  • 2017-06-05 GetInBufferCountGetOneDimSize
  • 2017-06-04 ActiveX控件导致浏览器死掉
  • 2017-06-05 问一个线程互斥的问题
  • 2017-06-05 关于MFCLISTBOX右键菜单无法响应的问题,请指教~
  • 2017-06-04 ActiveX数字签名问题求救!
  • 2017-06-05 工作者线程内能不能调用domodal生成模式对话框?
  • 2017-06-04 各位大侠请了,关于ActiveX控件的问题。
  • 2017-06-05 dll中对话框移动问题?

文章分类

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

最近更新的内容

    • 计算机图书网址
    • 一个关于多线程访问数据库的问题~~困扰了好几天了。请大家帮忙!
    • 服务中开窗口问题,请各位高手指点
    • 程序如何实现把IE的当前页面保存下来?
    • 关于IE调用的activeX控件,本地html无法调用的问题
    • 请问ATL建立的COM如何取得本控件的HWND,另有高分相送
    • 如何在自己的窗扣内载入并且显示一个ppt文件内容??谢谢赐教!
    • 关于ActiveX控件的问题!!!
    • 堆栈溢出问题非常奇怪
    • 我也要散分,求解关于DLL中使用MFC继承类无法调用的问题

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

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