[转]COM对象创建-外部机制
所谓“外部机制”,指的是应用程序创建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对象创建-外部机制相关推荐
- JVM——对象创建与内存分配机制
文章目录 1.对象的创建 1.1.类加载检查 1.2.分配内存 1.3.初始化 1.4.设置对象头 1.5.执行方法 2.对象内存分配 2.1. 对象栈上分配 2.2.对象在Eden区分配 2.3.大 ...
- 深入理解Java类型信息(Class对象)与反射机制
关联文章: 深入理解Java类型信息(Class对象)与反射机制 深入理解Java枚举类型(enum) 深入理解Java注解类型(@Annotation) 深入理解Java并发之synchronize ...
- Java 并发编程解析 | 如何正确理解Java对象创建过程,我们主要需要注意些什么问题?
苍穹之边,浩瀚之挚,眰恦之美: 悟心悟性,善始善终,惟善惟道! -- 朝槿<朝槿兮年说> 写在开头 从接触 Java 开发到现在,大家对 Java 最直观的印象是什么呢?是它宣传的 &qu ...
- JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
文章目录 前言 零.排序规范 1.happens-before原则 2.找文档位置 一.一线互联网企业关于对象面试题: (后面回答的就是这几个问题) 二.对象创建过程 三.对象在内存中的存储布局 1. ...
- 跟JVM搞对象 -- 深度剖析对象创建和内存分配
长久以来,面向对象编程大行其道.也正是因为有了面向对象的设计思想,技术才极大程度促进了社会的发展.作为新时代农民工,即已知晓或者掌握面向对象的编程方法,那么知其然也只其所以然也是我们每个人身体力行的必 ...
- OpenCV【零】—————cv::Mat——Mat对象创建方法
OpenCV (一)--Mat对象创建方法 目录 OpenCV (一)--Mat对象创建方法 1. cv::Mat优点及原理(本质类) 2. Mat类拷贝及对象的创建方法 3. Mat 对象元素的高效 ...
- 【JVM】Java对象创建的流程步骤
· 本文摘要 · 罗列Java创建对象的各种方式: · 讲解Java对象创建的流程步骤: 一.Java创建对象的各种方式 · 1. 用关键字new,老少皆知的方法:StringBuffer sb = ...
- java简述对象的组合_Java程序运行和对象创建过程简述
Java中一个对象创建分为两个步骤: 加载类,创建对象. 加载类是将所写的程序.java文件编译生成的.class文件加载到内存中,保证了对象创建的预置环境.类加载完毕后才可以创建该类的对象. 第一步 ...
- oracle使用sql文件创建表,使用SQL*Loader创建外部表之一
使用SQL*Loader创建外部表: ---创建目录对象并授权给Scott用户: SQL> create or replace directory loader_home as '/home/o ...
最新文章
- fs:[124]对应CurrentThread
- 040_Unicode对照表六
- zookeeper中展示所有节点_zookeeper工作原理与节点使用
- python评语生成_电商 Python 生成补单公司需要的评论格式3
- iPhone SE 3售价曝光:搭载A15芯片 价格依旧香
- [故事]Making machines with brains
- jQuery File Upload blueimp with struts2 简单试用
- Python3 NaN+NaN等于0
- 用java代码模拟鼠标双击事件
- 什么是编解码器codec
- 腾讯cdn设置 php,wordpress网站使用腾讯CDN的最佳缓存配置
- 新能力 | 云开发CMS内容管理系统,5分钟搞定小程序管理后台
- vue的App.vue
- 【阿拉伯数字转中文汉字工具类】
- Java 实现数据脱敏的技术方案
- 【BBED】使用bbed 修改data block Block Misplaced
- wc 一个进程结果是2_用开放的wc创建一个Web组件
- metabase table 类型entity_type 识别
- 美团-深度学习在点评推荐平台排序中的运用
- 从零开始快速入门Transformer注意力机制
热门文章
- 【福利】思科/华为/华三模拟器软件分享,附下载链接
- 精准容量、秒级弹性,压测工具 + SAE 方案如何成功突破传统大促难关?
- 雨棚板弹性法计算简图_造价工程师:钢结构工程量计算注意事项
- cass3d基础版_v1.1_仪表不凡说表:N厂“一劳永逸”V11版实至名归!
- redis创建像mysql表结构_如何给redis添加新数据结构
- oracle 联表求和不重复_别再瞎忙了,Excel多表格求和用这4个方法分分钟完成的事...
- 深度学习:人脸识别学习笔记
- Deep-Learning-YOLOV4实践:ScaledYOLOv4模型训练自己的数据集调试问题总结
- 【年终总结】2021年有三AI做了什么,2022年我们要做什么?
- 【总结】有三AI所有GAN相关学习资料汇总,有图文、视频、代码实战等......