所谓“外部机制”,指的是应用程序创建ATL COM对象类厂的过程。应用程序并不关心COM对象是MFC实现方式的还是ATL实现方式的,它永远使用CoCreateInstance这类API函数,通过类厂创建COM对象。在ATL下,应用程序对CoCreateInstance的调用,是如何转换到对ATL COM对象类厂CreateInstance方法的调用的呢?

COM服务器

COM对象不能凭空存在,它必须存在于操作系统的某种可执行文件中。由于只有Windows操作系统支持COM规范,很自然地,COM对象存在于Windows操作系统的可执行文件中。

Windows操作系统的可执行文件,其格式主要有两种:EXE和DLL。这里就不必要说这两种文件格式的区别了吧。如果不知道,这篇文章你估计也看不懂了。

能够生成COM对象的可执行程序叫COM服务器。EXE是进程外服务器,DLL是进程内服务器。这里只讨论DLL的情况。由于DLL本身只能通过对外输出的函数与外界交互,所以,DLL作为COM服务器也是通过四个输出函数来体现其服务器的作用。这就是著名的四个函数:

  • DllRegisterServer;
  • DllUnregisterSever;
  • DllGetClassObject;
  • DllCanUnloadNow;

COM服务器的工作机制可以用下图来表示:

COM服务器的重要功能可以归纳为三个:

  • 管理服务器的生命周期;
  • 管理服务器和对象的注册;
  • 获得COM对象的类厂;

我们可以看到,作为COM服务器的DLL,用四个函数来完成这三个方面的功能。四个输出函数的调用时机分别如下:

  • DllRegisterServer、DllUnregisterServer:使用regsvr32程序注册和反注册服务器时;
  • DllCanUnloadNow:当调用CoFreeUnusedLibraries系统函数时;
  • DllGetClassObject:从函数的字面意思来理解,应该是创建COM对象时该函数被调用。而我们知道创建COM对象的API函数是CoCreateInstance。CoCreateInstance是个封装函数,它包装了对CoGetClassObject,以及相应类厂的CreateInstance函数的调用。CoGetClassObject通过注册表机制,找到相应的服务器,并且调用服务器的DllGetClassObject函数来获得类厂。一旦获得类厂对象,就可以调用类厂对象的CreateInstance方法来创建COM对象了。

转载于:https://www.cnblogs.com/Quincy/archive/2010/03/25/1696169.html

[转]COM对象创建-外部机制相关推荐

  1. JVM——对象创建与内存分配机制

    文章目录 1.对象的创建 1.1.类加载检查 1.2.分配内存 1.3.初始化 1.4.设置对象头 1.5.执行方法 2.对象内存分配 2.1. 对象栈上分配 2.2.对象在Eden区分配 2.3.大 ...

  2. 深入理解Java类型信息(Class对象)与反射机制

    关联文章: 深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(enum) 深入理解Java注解类型(@Annotation) 深入理解Java并发之synchronize ...

  3. Java 并发编程解析 | 如何正确理解Java对象创建过程,我们主要需要注意些什么问题?

    苍穹之边,浩瀚之挚,眰恦之美: 悟心悟性,善始善终,惟善惟道! -- 朝槿<朝槿兮年说> 写在开头 从接触 Java 开发到现在,大家对 Java 最直观的印象是什么呢?是它宣传的 &qu ...

  4. JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配

    文章目录 前言 零.排序规范 1.happens-before原则 2.找文档位置 一.一线互联网企业关于对象面试题: (后面回答的就是这几个问题) 二.对象创建过程 三.对象在内存中的存储布局 1. ...

  5. 跟JVM搞对象 -- 深度剖析对象创建和内存分配

    长久以来,面向对象编程大行其道.也正是因为有了面向对象的设计思想,技术才极大程度促进了社会的发展.作为新时代农民工,即已知晓或者掌握面向对象的编程方法,那么知其然也只其所以然也是我们每个人身体力行的必 ...

  6. OpenCV【零】—————cv::Mat——Mat对象创建方法

    OpenCV (一)--Mat对象创建方法 目录 OpenCV (一)--Mat对象创建方法 1. cv::Mat优点及原理(本质类) 2. Mat类拷贝及对象的创建方法 3. Mat 对象元素的高效 ...

  7. 【JVM】Java对象创建的流程步骤

    · 本文摘要 · 罗列Java创建对象的各种方式: · 讲解Java对象创建的流程步骤: 一.Java创建对象的各种方式 · 1. 用关键字new,老少皆知的方法:StringBuffer sb = ...

  8. java简述对象的组合_Java程序运行和对象创建过程简述

    Java中一个对象创建分为两个步骤: 加载类,创建对象. 加载类是将所写的程序.java文件编译生成的.class文件加载到内存中,保证了对象创建的预置环境.类加载完毕后才可以创建该类的对象. 第一步 ...

  9. oracle使用sql文件创建表,使用SQL*Loader创建外部表之一

    使用SQL*Loader创建外部表: ---创建目录对象并授权给Scott用户: SQL> create or replace directory loader_home as '/home/o ...

最新文章

  1. fs:[124]对应CurrentThread
  2. 040_Unicode对照表六
  3. zookeeper中展示所有节点_zookeeper工作原理与节点使用
  4. python评语生成_电商 Python 生成补单公司需要的评论格式3
  5. iPhone SE 3售价曝光:搭载A15芯片 价格依旧香
  6. [故事]Making machines with brains
  7. jQuery File Upload blueimp with struts2 简单试用
  8. Python3 NaN+NaN等于0
  9. 用java代码模拟鼠标双击事件
  10. 什么是编解码器codec
  11. 腾讯cdn设置 php,wordpress网站使用腾讯CDN的最佳缓存配置
  12. 新能力 | 云开发CMS内容管理系统,5分钟搞定小程序管理后台
  13. vue的App.vue
  14. 【阿拉伯数字转中文汉字工具类】
  15. Java 实现数据脱敏的技术方案
  16. 【BBED】使用bbed 修改data block Block Misplaced
  17. wc 一个进程结果是2_用开放的wc创建一个Web组件
  18. metabase table 类型entity_type 识别
  19. 美团-深度学习在点评推荐平台排序中的运用
  20. 从零开始快速入门Transformer注意力机制

热门文章

  1. 【福利】思科/华为/华三模拟器软件分享,附下载链接
  2. 精准容量、秒级弹性,压测工具 + SAE 方案如何成功突破传统大促难关?
  3. 雨棚板弹性法计算简图_造价工程师:钢结构工程量计算注意事项
  4. cass3d基础版_v1.1_仪表不凡说表:N厂“一劳永逸”V11版实至名归!
  5. redis创建像mysql表结构_如何给redis添加新数据结构
  6. oracle 联表求和不重复_别再瞎忙了,Excel多表格求和用这4个方法分分钟完成的事...
  7. 深度学习:人脸识别学习笔记
  8. Deep-Learning-YOLOV4实践:ScaledYOLOv4模型训练自己的数据集调试问题总结
  9. 【年终总结】2021年有三AI做了什么,2022年我们要做什么?
  10. 【总结】有三AI所有GAN相关学习资料汇总,有图文、视频、代码实战等......