Com 学习笔记1

本文介绍了COM(组件对象模型)的基本概念,强调其作为一种跨应用和语言共享二进制代码的方法的重要性。文章详细阐述了COM的工作原理,包括二进制标准、进程内服务器的注册与实现,以及必要的函数如DllGetClassObject()的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

COM即组件对象模型,是Component Object Model

COM是一种跨应用和语言共享二进制代码的方法。与C++不同,它提倡源代码重用。ATL便是一个很好的例证。源码级重用虽然好,但只能用于C++。它还带来了名字冲突的可能性,更不用说不断拷贝重用代码而导致工程膨胀和臃肿。

COM通过定义二进制标准解决了这些问题,即COM明确指出二进制模块(DLLs和EXEs)必须被编译成与指定的结构匹配。这个标准也确切规定了在内存中如何组织COM对象。COM定义的二进制标准还必须独立于任何编程语言(如C++中的命名修饰)。一旦满足了这些条件,就可以轻松地从任何编程语言中存取这些模块。由编译器负责所产生的二进制代码与标准兼容。这样使后来的人就能更容易地使用这些二进制代码。

 

 

最简单的一种COM服务器,进程内服务器(in-process)。“进程内”意思是服务器被加载到客户端程序的进程空间。进程内服务器都是DLLs,并且与客户端程序同在一台计算机上。进程内服务器在被COM库使用之前必须满足两个条件或标准:

  1. 必须正确在注册表的HKEY_CLASSES_ROOT\CLSID 键值下注册;
  2. 必须输出DllGetClassObject()函数;

  这是进程内服务器运行的最小需求。在注册表的HKEY_CLASSES_ROOT\CLSID 键值下必须创建一个键值,用服务器的GUID作为键名字,这个键值必须包含两个键值清单,一是服务器的位置,二是服务器的线程模型。 COM库对 DllGetClassObject() 函数进行调用是在CoCreateInstance() API中完成的。

还有三个函数通常也要输出:

  • DllCanUnloadNow():由COM库调用来检查是否服务器被从内存中卸载;
  • DllRegisterServer():由类似RegSvr32的安装实用程序调用来注册服务器;
  • DllUnregisterServer():由卸载实用程序调用来删除由DllRegisterServer()创建的注册表入口;

 

extern UINT g_uDllRefCount;  // 服务器的引用计数

COM类的构造函数g_uDllRefCount++,析构函数g_uDllRefCount--

UINT m_uRefCount;               // com对象的引用计数

AddRef()时m_uRefCount++,Release()时m_uRefCount--

 

COM对象在请求接受时QueryInterface() 函数内部如果成功应自动调用AddRef();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值