COM原理
+ -

COM的应用

2022-02-07 104 3

当给组件增加函数时,无需修改已发表的接口,而是提供一个新的接口来完成功能扩展。
组件A有2个自定义接口,组件B是A的升级,接口结构如下:
COM对象模型
假设设计了组件A,它有2个自定义接口。IMathe有Add方法完成整数加法,IStr有Cat方法完成字符串连接。
升级组件A到B,欲增加一个Mul方法完成整数乘法。由于组件A已发布,因此不能把这个方法安排到IMathe中。解决方法是再定义一个新接口IMathe2,在新接口中增加Mul方法并保留Add方法。这样,老用户不知道新接口IMathe2的存在,仍可使用旧接口IMathe;而新用户则可抛弃IMathe直接使用IMathe2的新接口功能。多平滑的升级方式!

COM组件是一种基于二进制对象协议的概念。可理解为,这是一个二进制意义上的类。一个COM组件,对外暴露的不是一组方法,而是一组接口。COM组件直观理解就是一个类,但这不是严谨的定义(有的语言没有类,但它可实现COM组件);
COM组件通常是一个类,也可能是用多个类实现的。是一个类还是多个类实现的,对客户而言不知道也不关心。
从COM意义上讲,接口是一种和目前vtbl机制相容的二进制协议,且vtbl的前3项与IUnknown接口相容(从继承角度上讲可理解为要求从IUnknown继承)。可定义如下接口:

interface IFoo:IUnknown
{
    virtual void __stdcall fooA()=0;
    virtual int __stdcall fooB(intarg1,intarg2)=0;
};

也可以这样写,而是用纯C风格:

struct IFoo Vtbl
{
    HRESULT(__stdcall*QueryInterface)(void * pThis,const GUID * iid,void ** ppv);
    ULONG(__stdcall*AddRef)(void*pThis);
    ULONG(__stdcall*Release)(void*pThis);
    void(__stdcall*fooA)(void*pThis);
    int(__stdcall*fooB)(void*pThis,intarg1,intarg2);
};
struct IFoo
{
    structI Foo Vtbl*vptr;
};

0 篇笔记 写笔记

IRP的完成IoCompleteRequest
每当一个IRP在下层设备层完成时,是需要调用IoCompleteRequest来实现IRP的完成,这个完成其实是实现对执行的IRP的善后操作,这个操作其实是一个宏,真实函数数是IofCompleteRequest。#define IoCompleteRequest IofCompleteReque......
IoCopyCurrentIrpStackLocationToNext和IoSkipCurrentIrpStackLocation操作的IO_STACK_LOCATION有什么区别
在Windows驱动中,传递IPR一般有两种操作:一种是调用IoSkipCurrentIrpStackLocation,表示跳过本层驱动的操作,直接转发至下层: IoSkipCurrentIrpStackLocation(Irp); return IoCallDriver(FDODeviceEx......
IRP完成APC执行函数IopCompleteRequest
IRP在完成时调用IoCompleteRequest,其最终会执行一个APC调用,该调用的函数名为IopCompleteRequest。其调用APC调用时的代码如下:KeInitializeApc(&Irp->Tail.Apc, &......
WDDM 显卡及显卡驱动的分类
随着显卡的技术的发展,对于三维图形处理的功能越来越强,所以直接导致的一个结果就是显卡的数学处理能力(浮点计算)的功能越来越强。所以对于一些需要进行大量数学计算的模块,将这些功能交由显卡来进行处理相比较CPU更能大幅度提高效率。如现在的人功智能AI,还有前几年火热的挖矿…这些都是需要复杂的数学计算......
PortClass中的COM
一般的Windows驱动我们采用的是WDM驱动架构,最近的Windows驱动架构WDF也是建立在WDM基础上的。这些基于WDM的一般设备驱动可以应付大部分的设备驱动,如串口,PCI,USB等通用设备驱动。但是微软的关于流的处理的一些服务及驱动采用的面向对象的设计方法,是基于COM进行开发的,典型的像......
IRP完成例程IoSetCompletionRoutine的设计和实现原理
在进行IRP下层传递时,通过上一节可知道,一种中使用IoCopyCurrentIrpStackLocationToNext,另一种是IoSkipCurrentIrpStackLocation。其中在使用IoCopyCurrentIrpStackLocationToNext表示的是对当前的IRP当留当......
COM的QueryInterface与NonDelegatingQueryInterface关系
COM类的实现如下:class CMyComponent : public CUnknown, public ISomeInterface{public: DECLARE_IUNKNOWN; STDMETHODIMP NonDelegatingQueryInterface(RE......
COM的QueryInterface与NonDelegatingQueryInterface的测试用例
COM中,函数的调用实际是汇编 call 函数地址.对于一个类里定义的函数实际是一个一个的地址偏移.如果地址偏移是一样而且参数个数与排列都一样,函数叫什么名字是没有关系的。这里关于这句话做一个测试用例,用于测试COMM的妙用:#include #include......
COM简介
COM是什么COM是由Microsoft提出的组件标准,它不仅定义了组件程序之间进行交互的标准,并且也提供了组件程序运行所需的环境。在COM标准中,一个组件程序也被称为一个模块,它可以是一个动态链接库,被称为进程内组件;也可以是一个可执行程序(即EXE程序),被称作进程外组件。一个组件程序可包含一......
COM的应用
当给组件增加函数时,无需修改已发表的接口,而是提供一个新的接口来完成功能扩展。组件A有2个自定义接口,组件B是A的升级,接口结构如下:假设设计了组件A,它有2个自定义接口。IMathe有Add方法完成整数加法,IStr有Cat方法完成字符串连接。升级组件A到B,欲增加一个Mul方法完成整数乘法。由于......
COM全局唯一标识符GUID
COM规范采用了128位全局唯一标识符GUID来标识对象和接口,这是一个随机数,并不需要专门机构进行分配和管理。因为GUID是个随机数,所以并不绝对保证唯一性,但发生标识符相重的可能性非常小。从理论上讲,如果一台机器每秒产生10000000个GUID,则可保证(概率意义上)的3240年不重复)。GU......
COM 接口描述语言IDL
COM规范在IDL接口描述语言(OSF的DCE规范)的基础上,通过扩展形成了COM接口的描述语言。接口描述语言提供了一种不依赖于任何语言的接口的描述方法,因此,可成为组件程序和客户程序之间的共同语言。COM规范使用的IDL不仅可用于定义COM接口,同时还定义了一些常用数据类型,也可描述自定义的数据......
COM进程模型及可用性特性
COM进程模型COM有两种进程模型:进程内对象和进程外对象。如果是进程内对象,则它在客户进程空间上运行;如果是进程外对象,则它运行在本机上的另一个进程空间或远程机上。进程内服务器:服务程序被加载到客户的进程空间,在Win32环境下,通常服务程序代码以动态连接库(DLL)的形式实现;本地服务器:服......
COM组件注册信息
根据COM规范,客户程序通过COM库完成COM对象的创建,COM库则通过注册表所提供的信息进行组件的创建。注册表中包含了所有COM组件的必要信息。组件程序和客户程序都可访问注册表。组件程序把它所实现的COM对象的信息及接口信息保存到注册表中,称之为组件的注册。COM组件在HKEY_CLASSES_......
COM 类厂和DllGetObjectClass函数
类厂是COM对象的生产基地,COM库通过类厂创建COM对象;对应每一个COM类,都有一个类厂,用于该COM类的对象创建操作。类厂本身也是一个COM对象,它支持一个特殊接口(IClassFactory):class IClassFactory:public IUnknown{ virtua......
作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!