在开发过程中,为提高内聚减少偶合,为系统的扩展性和维护性,通常都需要将不同的功能模块进行分离,即模块化,

对于模块化,除了以传统的DLL方式外,应用COM组件方式构件系统应该是最佳选择.

Automation自动化被作为COM组件技术的高级应用,在这,结合对其粗浅应用,简单说说Automation(自动化).温习的同时也希望能给初学者有点参考价值.

为方便说明自动化/普通的COM/普通的DLL三者的区别,先看看以下调用关系示意图,

创建自动化:

首先是创建自动化组件F1.DLL,其.创建过程可以依照MFC向导,一步步即可,其中有步需要勾选"Automation".向导完后,就可以申明和定义接口.然后编译注册就可以供外部调用

调用自动化:

客户调用上述自动化组件时,在客户模块中建立"自动化对象(F1.dll)"的代理类,其创建是通过类向导中的"Automatioin"选项页导入自动化组件以生成"接口代理(封装)类","接口"指的是自动化组件中定义的接口.

根据向导自动生成代理类后,注意下代理类的成员,就会发现自动化接口申明的所有方法都在其代理类中有原份拷贝.
有了这一代理类后,客户程序就可以直接调用自动化对象所申明的接口,
而不需要自动化DLL的任何接口或类型信息文件(这就是与普通COM组件区别所在).完全断开了自动化接口类型信息!

相比,客户对通常的COM组件调用,需要通过#import方式依靠编译器从DLL中导出并生成相应的.h或.tlb文件,该文件包含COM接口的GUID及其他相关类型信息.

#import "dll" 这一命令,实际上客户程序在编译器的帮助下,完成了类似于大家熟悉的include<*.h>操作.

这也就是自动化技术与普通COM组件的区别及奥妙之处.

用过COM的,可能会疑问,没有类型信息或在内存中生成虚表,那客户程序到底怎么实现动态晚期绑定?

其实,自动化组件绑定时期,比通常所说的动态晚期绑定还要晚,

大家都知道,通常COM是通过内存中的虚表(函数指针数组)来绑定.

而这个虚表,实际上,由编译器在编译过程中根据COM接口的相关信息悄悄构建。

值得注意的是:

编译器在编译过程中,遇到接口的函数调用时,实际上,将函数调用替换成:“虚表指针 + 索引号”。

索引号就是函数所在虚表的位置。这样,接口的函数调用就在编译时被绑定到虚表的某一个位置,只是直到运行时,才知道索引号所对应虚表的位置内的“实际存放的函数指针值”。

以上,COM接口的函数晚期绑定,与自动化对象相比,应该算是“早绑定”。

甚至也可以认为,在调用自动化接口的函数时,在编译时压根就不需要绑定,也就是,绑定不是由编译器完成,而是在运行时根据函数名由自动化对象自身所定义的方法去完成绑定过程。只要给个字符串(函数名),绑定过程由自己的代码来完成,这就是自动化的特别及奥妙所在。

所以,调用自动化接口函数时,其绑定过程,不是通过编译器也不是通过虚表,而是在运行时通过其函数名(字符串)或索引号(整型数)传给自身的方法去完成.

客户程序只要通过代理类知道几个字符串(即:组件名\接口名\函数名)就可以实现自动化调用.

这样,调用起来比常说的COM组件方便多了,也不需要知道GUID或接口类型,不需要其他类型信息文件.

这一特性,为开发提供了很大灵活性.也由此,自动化也成为真正跨编译环境调用.也为脚本非编译语言调用COM提供方便.

至于自动化为何能通过名字(字符串)绑定函数,对此,可以参考<COM原理及应用>一书,讲得很详尽.

以上,只是简单原理,其实际实现过程在此简略.

自动化完后,再来说说普通COM的运用:

上图中,自动化又调用COM组件,其调用是通过#import方式引入,
#import的作用实际上就是依靠编译器创建了被引入COM组件的类型信息文件(.h或.tlh后缀).

引入外部组件信息后,通过智能指针CComQIPtr<接口名,接口GUID>,加载组件.如:
申明所调用接口的智能指针(智能指针为方便接口引用记数的管理):
CComQIPtr <IXXX接口名, &IID_IXXXX接口GUID> m_pIMyInterFace;
加载并创建组件对象:
m_pIMyInterFace.CoCreateInstance(CLSID_XX/*组件对象GUID,一个COM组件可以包括多个组件类(后对象)*/, NULL, CLSCTX_INPROC_SERVER);

以上出现的“IXXX接口名”、“IID_IXXXX接口GUID”、“CLSID_XX组件对象GUID”等都是通过“#import ”引入。

另外说明:
CComQIPtr<> 和 CComPtr<>这两个类都在 <atlbase.h> 中声明。
CComQIPtr<> 包含了 CComPtr<>的所有功能,因此可以完全用 CComQIPtr<> 来使用智能接口指针,
完成接口引用记数的自动管理.CComQIPtr<> 唯一的缺点就是不能定义 IUnknown * 指针。
CComQIPtr必须要两个模板参数:一个是被操纵接口类型 ,另一个是对应于这个接口的GUID.

也可以通过一个已知接口得到另一个接口:
CComQIPtr <IXXXX, &IID_IXXXXX>   pIXXXX(m_pIXXXXX);

普通DLL(略).

以上,错之处,请斧正.

COM高级应用-Automation(自动化)已是昨日黄花不再高级?相关推荐

  1. 高级过程控制传热自动化实训装置

    ZN-CR1高级过程控制传热自动化实训装置 一.概述 ZN-CR1高级过程控制传热自动化实训装置,过程装备与控制工程是高等院校的一个工科专业, 换热实验是本专业一项十分重要的教学与科研内容.原专业的实 ...

  2. 华为国产系统Android,安卓系统已成昨日黄花!这个国产系统要挑战iOS!

    原标题:安卓系统已成昨日黄花!这个国产系统要挑战iOS! 众所周知,现在智能手机系统基本被安卓和iOS瓜分,其中安卓因为本身开源特性和较低的部署成本,是目前世界上绝大多数手机的通用系统,而iOS作为苹 ...

  3. attachment_fu 已是昨日黄花,今朝请用paperclip

    attachment_fu 已是昨日黄花,今朝请用paperclip

  4. 最新《Python 高级运维自动化开发实战大师班》

    课程目标 适用人群 运维工程师,运维工程师,在校学生 课程简介 从0基础到Python 高级运维自动化高级运维工程师,涵盖了运维自动化基础. 运维自动化系统管理.运维自动化web编程.,运维自动化四方 ...

  5. 西门子博途SCL高级博图SCL运动控制自动化项目实例西门子整 套高级SCL编程运动控制

    西门子博途SCL高级博图SCL运动控制自动化项目实例西门子整 套高级SCL编程运动控制

  6. 2021年茶艺师(高级)考试内容及茶艺师(高级)考试资料

    题库来源:安全生产模拟考试一点通公众号小程序 安全生产模拟考试一点通:茶艺师(高级)考试内容参考答案及茶艺师(高级)考试试题解析是安全生产模拟考试一点通题库老师及茶艺师(高级)操作证已考过的学员汇总, ...

  7. 高级程序员装逼指南,是高级哦!(转)

    高级程序员装逼指南,是高级哦! 下面这个才是高级版本 ;; 这是注释 ;; 0.9版本 ;; 2011年8月22日 ** 前言 ** 最近网上出了一个<程序员装逼指南>,觉得这个东西其实图 ...

  8. 2021年机修钳工(高级)找解析及机修钳工(高级)操作证考试

    题库来源:安全生产模拟考试一点通公众号小程序 安全生产模拟考试一点通:机修钳工(高级)找解析参考答案及机修钳工(高级)考试试题解析是安全生产模拟考试一点通题库老师及机修钳工(高级)操作证已考过的学员汇 ...

  9. 2021年茶艺师(高级)最新解析及茶艺师(高级)考试试题

    题库来源:安全生产模拟考试一点通公众号小程序 安全生产模拟考试一点通:茶艺师(高级)最新解析参考答案及茶艺师(高级)考试试题解析是安全生产模拟考试一点通题库老师及茶艺师(高级)操作证已考过的学员汇总, ...

最新文章

  1. 《强化学习周刊》第14期:元强化学习的最新研究与应用
  2. spring boot2.x整合redis
  3. Centos Mysql数据还原
  4. Dubbo负载均衡算法
  5. C++框架_之Qt的信号和槽的详解
  6. 《iVX 高仿美团APP制作移动端完整项目》02 搜索、搜索提示及类别需求分析思路及制作流程
  7. webapp文本编辑器_Project Student:维护Webapp(可编辑)
  8. lodash 学习资料
  9. python脚本运行命令_从Python脚本运行shell命令
  10. cout 数组_C++用指针访问数组元素(学习笔记:第6章 08)
  11. 三、synchronized同步锁
  12. CSS学习笔记 -- Position(定位)
  13. python excel案例导入jira_用Python脚本批量添加JIRA用户,python,jira
  14. mongodb安装指南 及使用
  15. 使用AVR-GCC编程Arduino
  16. KB:Office 365 MX验证出错OWA 打开后Http 404
  17. 用傅里叶分析得到频域信息 MATLAB,信号分析实验_傅里叶matlab实现.doc
  18. 100个最励志最科学的无敌成功法则
  19. Ubuntu下将TinyOS移植到CC2430芯片
  20. 阿里网易海康等HR联盟来了,打工人颤抖吧

热门文章

  1. 哀悼日网页彩色变黑白方法-css样式修改
  2. 最新今日头条抢红包福袋脚本下载
  3. AI厂工什么时候开始赛博搬砖?
  4. 孪生素数猜想,不值一提
  5. pap认证过程_思科课件8、PAP认证、CHAP认证
  6. 02Linux常用的基本命令
  7. HDFS的Shell操作和API操作
  8. 红旗Linux开发商中科红旗倒闭
  9. oracle 修改 dbid,Oracle 在使用NID更改DBID时ORA-01122 ORA-01110 ORA-01206
  10. 关于PLM/EVT/DVT/PVT/MP的解释