• 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为什么要使用template/模板?

atl为什么要使用template/模板?

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

佚名通过本文主要向大家介绍了atl34砂轮,atl方形动力电池,atl80.dll官方下载,atl71.dll一键修复,atl71.dll修复等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: atl为什么要使用template/模板?
描述:

atl为什么要使用template/模板?
大概知道是可以用template技术取代了虚函数开销,
但是,到底是怎么用template实现的啊?
有详细一点的文章吗?


解决方案1:

COM只支持接口继承,而不支持实体继承,所以无法在设计COM组件的时候通过C++实体继承的方式来重用代码,举个例子,如果我有个IUnknowne的实现
class CUnknown : public IUnknown
{
public:
  HRESULT QueryInterface( ... );
  LONG AddRef();
  LONG Release();
};
然后我有个从IUnknown派生的接口IMyInterface
interface IMyInterface : IUnknown
{
  HRESULT MyFunc();
};
我不可能通过简单的继承CUnknown然后再加入一个MyFunc的实现来实现IMyInterface, 也就是说这里无法使用C++的实体继承。
当然你说我可以通过虚拟继承的方式来支持这个,但是这样一来,接口就不能维持它的
简单性, 例如,如果COM支持虚拟继承,那么用C++抽象类描述的IUnknown接口和IMyInterface就应该是这样定义的:
class IUnknown
{
public:
  virtual HRESULT QueryInterface( ... ) = 0;
  virtual LONG AddRef() = 0;
  virtual LONG Release() = 0;
};
class IMyInterface : virtual public IUnknown
{
public:
  virtual HRESULT MyFunc() = 0;
};
需要注意的是上面的IMyInterface的定义和不通过虚拟继承的IMyInterface是不一样的
下面是不通过虚拟继承的IMyInterface的定义
class IMyInterface : public IUnknown
{
public:
  virtual HRESULT MyFunc() = 0;
};
如果IMyInterface通过虚拟继承派生IUnknown, 那么虚拟表就会非常复杂,而不仅仅是一个平面的函数指针表那么简单,而且虚拟继承会带来时间和空间上的额外开销。
但是如果使用模板,那么这些问题都可以解决。通过使用模板,我们可以将需要实现的接口延迟到模板实例化的时候确定。
比如我只需要将原来的CUnknowne的实现改成模板类。
template<class InterfaceType>
class CUnknown : public InterfaceType
{
  HRESULT QueryInterface( ... );
  LONG AddRef();
  LONG Release();
};
而CMyInterface的实现可以是
class CMyInterface : public CUnknown<IMyInterface>
{
public:
  virtual HRESULT MyFunc() {};
};
在CMyInterface的实现里,我们给CUnknown模板提供一个参数 - IMyInterface, 通过这种方式我们实现代码的重用。
当然,为了更大的灵活性,我也可以将CMyInterface改变成一个模板类
template<class InterfaceType>
class CMyInterface : public CUnknown<InterfaceType>
{
public:
  virtual HRESULT MyFunc() {};
};
这样,当我需要派生IMyInterface的时候,例如
interface IMyInterfaceEx : IMyInterface
{
  HRESULT MyFuncEx();
};
我就可以这样子实现:
class CMyInterfaceEx : public CMyInterface<IMyInterfaceEx>
{
public:
  HRESULT MyFuncEx() {}
}
当然这种代码重用的方式和C++的基于实体继承或者组合或者虚拟继承的方式都不一样。

解决方案2:

接口的继承关系
而又不需要每个人都来自己写基接口的实现
仔细研究一下 IDispatchImpl, 就会明白了

解决方案3:

每写个com都要手动写一些几乎相同的代码,而且这些代码很容易出错eg:idl。显得特别繁琐,atl可以消除你的烦恼。最好看看《atl深入解析》

解决方案4:

比如IUNKNOWN,IDISPATCH,IPERSISTER,等好大批的接口的实现就那么模式化的几套,与我们的对象的类型没有关系,所以可以在不知道我们的类型的情况下实现出来,这不就是泛型编程吗?

解决方案5:

详细的文章也讲不清楚这些问题,<<ATL INTERNALS>>讲的就很清楚.虚函数的开销是不可能取消的,这是COM的技术基础.使用template是用泛型编程,特别适合用C++来开发COM组件


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

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

  • ATL怎么实现可变参数的接口?
  • 怎样用ATL写一个含有其它组件的进程外COM
  • ATL7中加入socket的头文件编译出错
  • 在ATL工程MFC窗口调用Create失败(注:我的ATL工程支持MFC)
  • ATL正则表达式验证遇到中文出现异常!
  • 关于ATL做复合控件的问题
  • [讨论]ATL中的文本字符串,我该定义为什么类型
  • ATL开发指南第2版为什么所有的书店都没有卖的?电子版也没有
  • 大家一般都怎么打包Atl开发的ActiveX控件?
  • 求ATL解决方案

相关文章

  • 2017-06-04 兑现诺言:新贴补分。
  • 2017-06-05 大家提供点思路好吗?
  • 2017-06-05 奇特问题——两个DLL的私有变量相互干扰!!!
  • 2017-06-05 关于多线程问题
  • 2017-06-04 atl怎么才能作出一个和mfc模式下样的有界面的ocx,我生成的xdll,想在网页里加入,但是老是找不到xdll嵌入不进去啊
  • 2017-06-04 在复合控件中如何动态创建一个按扭
  • 2017-06-04 WMI,RemoteWMIConnect,服务调用WMI
  • 2017-06-04 哪里有免费的COM的书下载?
  • 2017-06-04 请教各位高手,推荐几本关于com方面的书籍吧,由浅入深最好,非常感谢!
  • 2017-06-05 socket的线程问题又来了。

文章分类

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

最近更新的内容

    • 各位仁兄:我用MFC开发一个active控件,需要返回字符串给JS调用,一直调试不成功。
    • 敬请各位高手指点,多线程学习是遇到一问题?
    • 感觉用COM的智能指针的时候,CLSID是个多余的参数啊!
    • 显示MFCRegularDLL中的对话框出现问题!!!请高手指教!!!
    • 攒够60分,再问问关于IE中activex的问题
    • RedFile()和WriteFile()进行串口数据通信问题
    • 如何更新ActiveX控件
    • 在线等待,DCOM服务端如何得到调用端的机器名或IP地址
    • ActiveX控件应该怎么处理IE刷新的操作?
    • ATL编写的ActiveX空间如何给进程发消息

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

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