COM组件对象模型基础
COM组件对象模型
COM组件对象模型是为了创建一种独立于任何编程语言的对象。COM对象提供统一的接口,在不同的编程环境中通过调用COM对象特定接口的方法来完成特定的任务。一般有三种方式编写COM组件:COM SDK,MFC,ATL
COM组件分类
- 一个DLL(进程内组件)。
方法与客户进程在同一地址空间下,可直接访问到。 - 一个本地运行的EXE(进程外组件,本地服务器)。
方法与客户进程在同一机器的不同地址空间中,通过LPC(本地过程调用)访问。 - 一个远程机器上运行的EXE(进程外组件,远程服务器)。
方法与客户进程在不同机器上,通过RPC(远程过程调用)。
COM对象和接口
一个COM组件可以含有多个COM对象,一个COM对象可以含有多个接口,一个接口可以含有多个方法。
为了在COM组件中唯一标识一个COM对象类,每一个COM对象类都有一个特定的标识符(CLSID),这个标识符是一个128位的数值。同样对于不同的接口而言也有一个标识符(IID),也是一个128位的数值。
IUnknown接口
//IUnknown接口的方法
QueryInterface //返回指向另一个接口的指针
AddRef //增加对象的引用计数
Release //减少对象的引用计数
每一个COM对象应该了IUnknown接口,而且为了通过对象任意一个接口指针都能调用其他接口,需要所有的接口处理实现自己的特定的方法外,还都要实现以上三种方法(每一个接口都继承IUnknown接口)。
HRESULT QueryInterface()
{
return (指定接口类*)this;
}
如果使用MFC实现COM,因为其采用多继承,而接口类的方法都是写成虚函数,COM对象类继承众多接口类会含有多个虚表(vtable),所以QueryInterFace返回的对应接口类的指针时需要强制类型转换(将this指针偏移到指定接口类的vtable处),这样就不会出错误调用到其他接口的方法。ATL实现COM采用的是嵌套类,其直接返回对应的接口指针。
ULONG AddRef()
{
return ++m_lRef;
}
ULONG Release()
{
if(--m_lRef == 0)
{
delete this;
return 0;
}
}
因为COM对象是有生命周期的,而且运行在EXE上的COM对象可供多个客户使用,每多一个用户就会调用AddRef增加一次引用计数。如果某个客户使用了COM对象,应该在最后不使用COM对象的时候调用Release方法减少对象的引用计数。当对象的引用计数减为零时对象就会销毁。
名称解析代理/桩基模块DLL
客户拥有的接口指针实际上是指向名称解析代理,它实现了与真实的对象相同的接口和方法。当客户调用对象中的方法时,调用传到名称解析代理,名称解析代理将使用某种LPC将调用提交给桩基模块。桩基模块展开方法参数并调用对象,然后将返回值调度会名称解析代理。如果是标准接口就不需要提供名称解析代理和桩基模块,但是如果是自定义接口就需要提供,而VC++带有一个MIDI的编译器,用来编译IDL(接口定义语言)文件,为名称解析代理和桩基模块提供源程序。
实例化COM对象
接口名称 * pName1;
HRESULT hr = CoCreateInstance(对象CLSID, NULL, CLSCTX_SERVER, 接口IID, (void**)&pName1);
另一个接口名称 * pName2;
hr = pName2->QueryInterface(接口IID, (void**)&pName2);
pName2->Release();
pName1->Release();
通过传递给CoCreateInstance函数CLSID实例化COM类,实际其是先实例化CLSID对象对应的"类工厂","类工厂"也是一个COM对象,然后通过"类工厂"的IClassFactory接口的CreateInstance方法来创建CLSID对应的COM类对象。(每一个COM对象都有与其对应的“类工厂”)
COM组件对象模型基础的更多相关文章
- 轻量jquery框架之--组件交互基础设计
概要 组件交互基础,即考虑在JQUERY对象下($)下扩展所有组件都需要用到的通用api,如ajax入口.对表单的操作.html片段加载.通用的配合datagrid通用的curd客户端对象等. 扩展a ...
- Vue.js-08:第八章 - 组件的基础知识
一.前言 在之前的学习中,我们对于 Vue 的一些基础语法进行了简单的了解,通过之前的代码可以清晰的看出,我们在使用 Vue 的整个过程,最终都是在对 Vue 实例进行的一系列操作. 这里就会引出一个 ...
- Python的扩展接口[2] -> 动态链接库DLL[1] -> 组件对象模型 COM 的 Python 调用
组件对象模型 COM 的 Python 调用 关于COM的基本概念,可参考组件对象模型 COM的内容,下面主要介绍两种使用 Python 调用 COM 组件的方法. 1 使用 win32com 1.1 ...
- EasyUI常用组件(基础)
---------------------------------------------------------------------------------------------------- ...
- Vue组件的基础用法(火柴)
前面的话 组件(component)是Vue最强大的功能之一.组件可以扩展HTML元素,封装可重用的代码,根据项目需求,抽象出一些组件,每个组件里包含了展现.功能和样式.每个页面,根据自己的需要,使用 ...
- Vue组件使用基础
这篇博文用来记录 .vue 组件的使用方法. 可以把组件代码按照 template.style.script 的拆分方式,放置到对应的 .vue 文件中. 模板(template).初始数据(data ...
- vue.js原生组件化开发(一)——组件开发基础
前言 vue作为一个轻量级前端框架,其核心就是组件化开发.我们一般常用的是用脚手架vue-cli来进行开发和管理,一个个组件即为一个个vue页面,这种叫单文件组件.我们在引用组件之时只需将组件页面引入 ...
- DRF框架(八)——drf-jwt手动签发与校验、搜索过滤组件、排序过滤组件、基础分页组件
自定义drf-jwt手动签发和校验 签发token源码入口 前提:给一个局部禁用了所有 认证与权限 的视图类发送用户信息得到token,其实就是登录接口,不然进不了登录页面 获取提交的username ...
- 【Vue】组件的基础与组件间通信
转载:https://segmentfault.com/a/1190000016409329 Vue.js 最核心的功能就是组件(Component),从组件的构建.注册到组件间通信,Vue .x 提 ...
随机推荐
- EF Core3.0+ 通过拦截器实现读写分离与SQL日志记录
前言 本文主要是讲解EF Core3.0+ 通过拦截器实现读写分离与SQL日志记录 注意拦截器只有EF Core3.0+ 支持,2.1请考虑上下文工厂的形式实现. 说点题外话.. 一晃又大半年没更新技 ...
- JVM虚拟机知识问答总结(简单复习,快速回忆!)
写在最前面 这个项目是从20年末就立好的 flag,经过几年的学习,回过头再去看很多知识点又有新的理解.所以趁着找实习的准备,结合以前的学习储备,创建一个主要针对应届生和初学者的 Java 开源知识项 ...
- java例题_06 最大公约数&最小公倍数
1 /*6 [程序 6 求最大公约数及最小公倍数] 2 题目:输入两个正整数 m 和 n,求其最大公约数和最小公倍数. 3 程序分析:利用辗除法. 4 */ 5 6 /*分析 7 * ======== ...
- 学习一下 SpringCloud (六)-- 注册中心与配置中心 Nacos、网关 Gateway
(1) 相关博文地址: 学习一下 SpringCloud (一)-- 从单体架构到微服务架构.代码拆分(maven 聚合): https://www.cnblogs.com/l-y-h/p/14105 ...
- 庐山真面目之十二微服务架构基于Docker搭建Consul集群、Ocelot网关集群和IdentityServer版本实现
庐山真面目之十二微服务架构基于Docker搭建Consul集群.Ocelot网关集群和IdentityServer版本实现 一.简介 在第七篇文章<庐山真面目之七微服务架构Consul ...
- C++并发与多线程学习笔记--单例设计模式、共享数据分析
设计模式 共享数据分析 call_once 设计模式 开发程序中的一些特殊写法,这些写法和常规写法不一样,但是程序灵活,维护起来方便,别人接管起来,阅读代码的时候都会很痛苦.用设计模式理念写出来的代码 ...
- [树形DP]电子眼
电 子 眼 电子眼 电子眼 题目描述 中山市石一个环境优美.气候宜人的小城市.因为城市的交通并不繁忙,市内的道路网很稀疏.准确地说,中山市有N-1条马路和N个路口,每条马路连接两个路口,每两个路口之间 ...
- [Fundamental of Power Electronics]-PART I-4.开关实现-0 序
4 开关实现 在前面的章节中我们已经看到,可以使用晶体管,二极管来作为Buck,Boost和其他一些DC-DC变换器的开关元件.也许有人会想为什么会这样,以及通常如何实现半导体的开关.这些都是值得被提 ...
- CSS3常见动画
一.是什么 CSS动画(CSS Animations)是为层叠样式表建议的允许可扩展标记语言(XML)元素使用CSS的动画的模块 即指元素从一种样式逐渐过渡为另一种样式的过程 常见的动画效果有很多,如 ...
- css详解background八大属性及其含义
background(背景) 以前笔者在css盒模型以及如何计算盒子的宽度一文中提到过盒模型可以看成由 元素外边距(margin).元素边框(border).元素内边距(padding)和元素内容(c ...