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

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

以前研究过DLL的,刚刚研究了一下EXE的情况,现在总结一下:

进程内DLL的情况下:

  1. 客户调用CoCreateInstance
  2. COM调用CoGetClassObject想获得类厂的接口指针
    1. CoGetClassObjec通过注册表找到Dll
    2. M加载该DLL到客户的进程中
    3. 调用该DLL的DllGetClassObject(CLSID, IID_IClassFactory, &ppv),返回类厂对象的IClassFactory的接口
  3. COM调用IClassFactory->CreateInstance(pUnkouter, IID, &ppvObject),创建对象,返回接口指针
  4. COM把接口指针作为结果返回

进程外EXE的情况下:

  1. 客户调用CoCreateInstance
  2. COM调用CoGetClassObject
    1. CoGetClassObject通过注册表找到EXE
    2. 启动EXE
    3. EXE在启动过程中会调用CoRegisterClassObject(CLSID, pUnk, dwClsContext, flags, &dwRegister)注册类厂对象
    4. 如果前面的对CoRegisterClassObject的调用用到了REGCLS_SUSPENDED标志,EXE调用CoResumeClassObject通知COM该对象已经做好准备接受请求(如果服务器支持多线程的话应该要这么做,避免Race Condition)
    5. CoGetClassObject取得之前CoRegisterClassObject所Register的指针(经过Marshal的)
  3. 获得了类厂对象的接口指针之后,下面的操作和进程内DLL的情况类似

  

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

相关推荐

c# 进程外Com服务(exe)编写调用

这是进程外Com服务(exe)编写调用的Demo程序,编写调试思路以及步骤可查看 http://blog.csdn.net/shu19880720/article/details/79537277 下载后记得在本地注册com以及修改本地注册表,否则无法使用,注册修改方法文章里也有的

C#创建 COM 对象 (C# 类公布到 COM )

所谓在 c#创建 com 对象,实际上就是向 com 公开用 c# 编写的组件对象接口。这个 c# 类及其成员必须遵循下列规则才能对 com 可见:1> 类必须是公共的。 2> 属性、方法事件必须是公共的。 3> 属性方法必须在类接口上声明。 4> 事件必须在事件接口中声明。 其他没有在这些接口中声明的类的公共成员对于 com 是不可见的,但它们对于其他 .net framewor

大鸾翔宇,遨游苍穹! 1614

C#程序设计通过Attribute特定创建COM实例对象

本文讲解C#程序设计通过Attribute特定创建COM实例对象。 操作流程 1.1. 声明代码 下面声明的JetEngineClass类只有一个单单的类声明,但是没有一个成员声明,但是一般的类声明有些不一样的是这个类多了两个特性(Attribute),把这个类COM对象联系在一起的就是这两个特性了,其中一个是ComImportAttribute,这个特性指明了所作用的类是从COM对象中来的,GuidAttribute指明了COM对象的GUID,也就是说明了创建这个COM需用到的GUID。有了这两个特

weixin_41883890的博客 282

C#创建COM对象

在本篇文章中,我们将讨论下面的问题: ·使用C#创建一个简单的COM对象(使用COM的Interop特性)。 ·从VC++客户端软件中访问COM。客户端软件使用了TypeLibrary(.TLB文件)。 为了简单方便开发人员使用、测试起见,我们使用了SQLSERVER数据库软件的缺省安装中的Northwind数据库。 ·修改COM对象中SQLServer的名字,与SQLServer连接。 ·我们

Ninth(天下第九)的专栏 1215

COM对象创建过程详细分析

1、   CoGetClassObject 函数原型: HRESULT CoGetClassObject(const CLSID& clsid, DWORD dwClsContext, COSERVERINFO* pServerInfo, const IID& iid, (void **)ppv); 参数说明:          clsid: 指定COM类厂的CLSID标识符;     

xiangzhang321的专栏 1308

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

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

baiyongjianai6584的博客 270

Com 组件的装载卸载 .

进程内组件的装载: 客户程序调用COM 库的 CoCreateInstance 或 CoGetClassObject 函数创建 COM 对象,在 CoGetClassObject 函数中,COM 库根据系统注册表中的信息,找到类标识符 CLSID 对应的组件程序(

MOKA 759

Com对象的解释

⊙ 第一章 概述   COM 是什么   COM 对象与接口   COM 进程模型   COM 可重用性⊙ 第二章 COM 对象模型   全局唯一标识符 GUID   COM 对象   COM 接口   接口描述语言 IDL   IUnknown 接口   COM 对象的接口原则⊙ 第三章 COM 的实现   COM 组件注册信息   注册 COM 组件   类厂 DllGetObject

EdisonGG的专栏 3986

COM组件简介

面向对象的思想难以适应这种分布式软件模型,于是组件化程序设计思想得到了迅速的发展。 按照组件化的程序设计的思想,复杂的应用程序被设计成一些小的,功能单一的组件模块,这些组件模块可以运行在同一台机器上,也可以运行在不同的机器上。 为了实现这样的应用软件,组建程序组建程序之间需要一些极为细致的规范, 只有组件程序遵守了这些共同的规范,然间系统才能正常运行。 为此,OMGMicro

踏雪无痕 851

进程内COM进程外COM

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

jonnypretty的专栏 1108

免注册进程外COM组件Demo的完整创建过程

最近由于我们产品的需求,要实现一个免注册的进程外COM,特意花了几天时间来研究这个东西,最终整个技术流程还是走通了,特意在此总结一下,不仅是对前面几天技术研究的总结,也能帮助到后面需要使用此技术的其他人。至于为什么选择免注册的进程外COM组件,是因为我们产品需要在一台机器上运行多份实例,如果用全局共享的注册方式,就要考虑组件各个版本的兼容问题,这个是一个很难处理的问题,因此最终还是选择了免注册的COM组件的方式,这样即能通过COM技术实现跨进程通信,也不用考虑多版本之间的兼容问题。

萧戈的专栏 1056

com进程内进程外组件

COM进程内组件与进程外组件 1.   COM进程内组件 进程内组件以动态链接库的形式存在(后缀名为dll),客户端需要使用进程内组件提供的服务时只需要将dll加载进客户端进程。进程内组件必须提供自注册功能,这样客户端进程才能在需要的从注册表中查找到相应的信息,并加载该组件。   进程内组件需要导出四个函数 DllRegisterServer: 参数:无 返回值:HRESULT 指示

CCT1990的专栏 3928

AutoCAD .NET API基础(五) 进程外进程内

Out-of-Process versus In-Process进程外进程内When you develop a new application, it can either run in or out-of-process. The AutoCAD .NET API is designed to run in-process only, which is different from th

Sunny的专栏 3418

ATL创建进程外COM组件服务(C++图解说明)

作者:HH 时间:2019-01-08 参考文献: 【1】https://blog.csdn.net/mergerly/article/details/8643472 【2】https://www.cnblogs.com/DeeLMind/p/7809115.html ============================================================...

pathfinder1987的博客 5777
上一篇: ACM UVa 算法题 #202 - Repeating Decimals的解法
下一篇: API Hook完全手册
ATField
博客等级 码龄25年 673粉丝 119原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值