com进程内进程外组件

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

COM进程内组件与进程外组件

1.   COM进程内组件

进程内组件以动态链接库的形式存在(后缀名为dll),客户端需要使用进程内组件提供的服务时只需要将dll加载进客户端进程。进程内组件必须提供自注册功能,这样客户端进程才能在需要的从注册表中查找到相应的信息,并加载该组件。

 

进程内组件需要导出四个函数

DllRegisterServer

参数:无

返回值:HRESULT 指示注册操作的错误类型

 

DllUnregisterServer

参数:无

返回值:HRESULT 指示删除注册表中的相应项操作的错误类型

 

DllGetClassObject

参数1CLSID&组件的CLSID(因为一个dll可以作为多个组件的载体)

参数2IID&,要从组件中获取的接口IID

参数3void**,接收获得的接口指针的双重指针

返回值: HRESULT 指示操作结果的错误类型,一般有(E_OUTOFME\

MORY, S_OK,E_NOINTERFACE,CLASS_E_CLASSNOTAVAILABLE);

DllCanUnloadNow

参数:

返回值:HRESULT 指示是否可卸载该组件

说明:COM库每隔一段时间便会自动调用该方法判断是否可以卸载该组件。

 

进程内组件注册表中需要的内容

位于HKEY_CLASSES_ROOTCLSID项下

其中7F21137D…为组件的CLSID

InprocServer32所对应的值为进程内组件的完整路径

ProgID 所对应的值为组件的易记名称客户端可以通过该名称获得组件的CLSID.

 

2.COM进程外组件

2.1  LPCRPC

COM采用LPC(本地过程调用)和RPC(远程过程调用)的方法进行进程之间的通信,LPC用于在同一机器上的不同进程之间进行通信,而RPC用于在不同机器上的进程之间进行通信

2.2 存根代理dll

为了提供LPC的处理,com提供了一个非常简便的方法,当组件为进程外组件时,客户将同一个模仿组件的dll进行通信,这个dll可以为客户完成参数调整以及LPC调用,这个dll在客户端称之为代理dll,而在服务器端称作为存根dll。

代理存根dll的生成步骤:

 

1. 编写idl文件

该idl文件包含了所有服务端组件定义的接口,组件标示符CLSID除外

2. 使用MIDL编译该IDL文件

编译后生成的一下几个文件

1) XXX_h.h   包含接口定义的头文件,和所有接口IID的声明

2) XXX_i.c   接口IID的定义

3) XXX_p.c   代理文件

4) Dlldata.c 数据文件

3. 使用以上文件生成存根代理dll

1)  在预处理增加REGISTER_PROXY_DLL

2)  提供输入库rpcrt4.lib   uuid.lib

3)  添加def文件,导出下图五个函数

4)  编译生成dll

生成后的dll会有五个导出函数如下图

 

前面四个和进程内组件意义一致

 

2.3  进程外组件的注册

进程外组件注册需要注册存根代理dll和组件exe文件,其中存根代理dll的注册和进程内组件的注册一致,而exe文件的注册就依靠其命令参数来进行。

组件程序的两个用于注册的入口函数为DllRegisterServerDllUnregisterServer,注册组件使用命令:RegSvr32 *.dll;反注册组件使用命令:RegSvr32 /u *.dll,进程内组件注册使用此命令。进程外组件注册必须支持两个命令行参数/RegServer/UnregServer

CLSID子键下:

1

 

2

Interface子键下:

3

4

 

其中ProxyStubClsid32为该接口的存根代理dllCLSID,图1,这样在查询某接口时com库就知道到哪加载存根代理dll

3 类厂

COM库通过类厂创建COM对象,对应每一个COM类,都有一个类厂专门用于该COM类的对象创建工作。类厂本身也是一个COM对象,它支持接口IClassFactory

CreateInstance创建对应的COM对象,LockServer控制组件的生存周期。

类厂由函数DllGetClassObject创建。

DllGetClassObject返回类厂对象的接口指针,再通过CreateInstance创建对应的COM对象。

4.COM库与类厂的交互

创建对象函数:

1)若创建远程对象或希望一次获取对象的多个接口指针,选用CoCreateInstanceEx

2)若希望获取类厂对象或要调用类厂的某些成员函数,选用CoGetClassObject,通常IID=IID_IclassFactory,进程内组件直接调用DLLCoGetClassObject,若CoGetClassObject创建的类厂对象位于进程外组件,函数启动组件进程,然后等待,直到组件进程把它支持的COM类对象的类厂注册到COM中,返回类厂信息。

3)其他情况下,选用CoCreateInstance创建对象,CoCreateInstance封装类厂创建对象的过程,返回COM对象的接口指针,不能创建远程机器上的对象。

 

 


5.COM库

COM库初始化函数:CoInitialize

COM库终止函数:CoUninitialize

COM库内存管理:

COM提供的内存管理器标准,是一个COM接口IMalloc。当组件内存的分配和释放不在同一模块,需要用到内存管理器,COM库封装了三个API函数,用于内存分配和释放

CoTaskMemAlloc

CoTaskMemFree
CoTaskMemRealloc

 

实现与掌握COM进程外组件的简易教程 接口定义语言(IDL)对于开发COM组件来说至关重要,因为它允许开发者定义可以在不同编程语言之间共享的接口。IDL文件作为COM组件之间通信的桥梁,确保了接口的标准化描述。IDL描述了组件如何与外界通信,它是一种语言无关的描述方式,允许编译器生成不同语言版本的代理和存根代码。这使得COM组件能够被不同的语言调用,增加了组件的可重用性和互操作性。类厂是一个特殊的COM对象,它实现了接口。这个接口有两个主要方法:和LockServer。通过这些方法,类厂可以控制如何创建组件实例。 阅读详情

相关推荐

COM组件学习

com组件,使用及创建。

weixin_51304431的博客 7808

什么是COM组件以及怎样创建(C#)?

什么是COM组件? 1.COM组件是以WIN32动态链接库(DLL)或可执行文件(EXE)形式发布的可执行代码组成。 2.COM组件是一些小的二进制可执行文件,必须以二进制的形式发布。 3.COM组件可以给应用程序、操作系统以及其它组件提供服务。 4.自定义的COM组件可以在运行时刻同其它组件连接起来构成某个应用程序。 5.COM组件必须是动态链接的。 使用COM组件需要注意:1.必须要保证升级应用时不破坏与以前版本...

草原上唱山歌的博客 7845

COM组件详解

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/rankun1/article/details/50850432 ...

qq_40272523的博客 7309

vs2019创建com组件并调用

软件体系结构实验一——创建com组件并调用。

qq_64574616的博客 2932

【cmake实战十一】com组件方法的简单实现

com组件方法的简单实现

junxuezheng的博客 1595

COM与ActiveX组件技术解析:从进程内DLL进程外EXE的设计抉择

组件化开发是软件工程中的核心概念,它通过定义清晰的接口契约,实现模块间的松耦合与二进制复用。其原理基于接口与实现分离,通过全局唯一标识符(GUID)确保组件识别的唯一性,并利用引用计数机制管理对象生命周期。这一技术价值在于实现了跨语言、跨进程的互操作能力,极大提升了代码复用率和系统集成效率。其应用场景广泛,从桌面应用的插件系统到遗留的企业级业务软件,都依赖于稳健的组件模型。本文聚焦于COM组件对象模型)及其在桌面端的实现——ActiveX,深入探讨其两种关键形态:ActiveX DLL与ActiveX E

weixin_30652491的博客 355

进程内COM进程外COM

1、进程内进程外Com COM/DCOM 组件可以在DLLEXE 文档中实现。 其中在 DLL 中实现的COM/DCOM组件称为 In-Process Server,因为这些组件是加载到使用它们的客户端应用程序执行程序内存之中。因此当应用程序调用COM/DCOM 组件的服务时,就和一般的程序或函数调用一样,非常快速。 在EXE 中实现的COM/DCOM组件是执行在它自己的执

发展是曲折的但也是前进的 3613

【转载】进程内COM进程外COM

原文:http://www.cnblogs.com/jyz/archive/2009/03/08/1406229.html   1、进程内进程外Com COM/DCOM 组件可以在DLLEXE 文档中实现。其中在 DLL 中实现的COM/DCOM组件称为 In-Process Server,因为这些组件是加载到使用它们的客户端应用程序执行程序内存之中。因此当应用程序调用COM/DCOM...

weixin_34019144的博客 124

COM原理与应用》学习笔记——COM的实现

一、进程内组件进程外组件 前面说过,COM组件支持进程内组件进程外组件两种方式。进程内组件的优势就是快、方便,但是如果组件里面有哪个地方崩溃了也会导致主进程的崩溃。进程外组件虽然比较慢,但是很稳定。如果组件某个地方崩溃了,最多就是没有结果,不会导致主进程的崩溃(比如,看到了浏览器插件崩溃了,没见到浏览器崩溃吧)。用户在使用COM组件的时候,实际上是感觉不出来进程内组件和...

baiyongjianai6584的博客 270

COM实现核心

讲述进程内进程外组件,类厂及COM在客户和服务两者间的实现过程

Gostorm 495

com组件注册与卸载

  老潘说:   COM规范中规定:支持自注册的进程外组件,必需支持两个命令行参数:     /RegServer和/UnRegServer,以便完成注册或注销操作.   进程内用:regsvr32 .dll文件 regsvr32 /u .ocx文件

xzmyzy的专栏 4877

COM原理和应用】3、COM的实现

1、进程内组件进程外组件 使用dll实现组件程序,则客户长须在调用组件程序的服务时,需要将dll装进自身的进程,所以客户程序和组件运行于同一进程空间,此类组件称为进程内组件。使用exe程序的组件,在被调用时自身具有进程空间,因此客户程序和组件运行在不同的进程空间,此类组件称之为进程外组件。 1.1、进程内组件 在客户程序与组件简历链接之后,客户程序可以得到直接指向组件接口虚函数表的接口指针

Workshop of Wenjie.Yin 1273

COM组件(MFC篇)

目 录 第1章 创建进程内组件1 1.1 目标1 1.2 创建项目3 1.2.1 VC++6.03 1.2.2 VC++20104 1.2.3 VC++6.0与VC++2010的区别6 1.3 升级项目6 1.3.1 增加接口定义文件6 1.3.2 覆盖应用程序类的InitInstance函数7 1.3.3...

予衡飞翔 2079

COM对象创建过程总结(进程外进程内

以前研究过DLL的,刚刚研究了一下EXE的情况,现在总结一下:进程内DLL的情况下: 客户调用CoCreateInstance COM调用CoGetClassObject想获得类厂的接口指针 CoGetClassObjec通过注册表找到Dll M加载该DLL到客户的进程中 调用该DLLDllGetCla

张羿的CSDN专栏 6540

com组件 的劫持_COM组件创建过程-还真有神秘的内部实现机制!

COM组件的创建可以通过CoCreateInstance()函数来完成,函数原型为:HRESULT __stdcall CoCreateInstace(const CLSID& clsid,IUnknown* pIUnknownOuter,DWORD dwClsContext,const IID& iid,void** ppv);函数参数clsid是要创建组件的CLSID,pIUn...

weixin_39603132的博客 178

ALT创建com组件以及测试方法

使用ATL创建进程内组件             一、建立一个进程内组件     1)打开菜单File|New,选择Projects标签,然后选择“ATL   COM   AppWizard”     2)在Project   name栏输入step01,单击ok按钮,在下一个窗口单击Finish按钮         插入对象:     3)打开菜单Inse

sage 2296

Com 组件的装载和卸载

<br />进程内组件的装载: <br /><br /><br /><br />客户程序调用COM 库的 CoCreateInstance 或 CoGetClassObject 函数创建 COM 对象,在 CoGetClassObject 函数中,COM 库根据系统注册表中的信息,找到类标识符 CLSID 对应的组件程序(DLL 文件)的全路径,然后调用 LoadLibrary(实际上是 CoLoadLibrary)函数,并调用组件程序的 DllGetClassObject 引出函数。DllGetClass

闻道有先后,术业有专攻,如是而已。 5694
上一篇: 使用dwm桌面窗口管理器实现Win7桌面绘图
CCT1990
博客等级 码龄16年 3粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值