COM组件开发知识重点——COM原理与应用篇(二)

转载 2016年04月08日 15:31:59

第3章 COM的实现

3.1 进程内组件(DLL)的实现,可以参考DLL技术,主要参数为:

1)LoadLibrary:装载DLL模块

2)GetProcAddress:取引出函数的地址

3)FreeLibrary:释放DLL模块

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

COM组件开发知识重点——COM原理与应用篇(二)3.2 组件程序的两个用于注册的入口函数为DllRegisterServer和DllUnregisterServer,注册组件使用命令:RegSvr32 *.dll;反注册组件使用命令:RegSvr32 /u *.dll,进程内组件注册使用此命令。进程外组件注册必须支持两个命令行参数/RegServer 和/UnregServer。
3.3 类厂

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

COM组件开发知识重点——COM原理与应用篇(二)CreateInstance创建对应的COM对象,LockServer控制组件的生存周期。

类厂由函数DllGetClassObject创建。

COM组件开发知识重点——COM原理与应用篇(二)DllGetClassObject返回类厂对象的接口指针,再通过CreateInstance创建对应的COM对象。
3.3.2 COM库与类厂的交互

    创建对象函数:

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

COM组件开发知识重点——COM原理与应用篇(二)

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

COM组件开发知识重点——COM原理与应用篇(二)

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

COM组件开发知识重点——COM原理与应用篇(二)COM组件开发知识重点——COM原理与应用篇(二)
3.4 COM库

    COM库初始化函数:CoInitialize

    COM库终止函数:CoUninitialize

3.4.2 COM库的内存管理

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

CoTaskMemAlloc

CoTaskMemFree
CoTaskMemRealloc

3.4.3 组件程序的装载和卸载

1)进程内组件的装载、卸载

2)进程外组件的装载、卸载

    组件程序满足两个条件才可以被卸载:组件中对象数为0;类厂的锁计数器为0。此时,DllCanUnloadNow返回TRUE。

    在判断返回类型HRESULT时,需用宏SUCCEEDED和FAILED。


此文件来自于【http://blog.sina.com.cn/s/blog_5698c05f0100lp2e.html】

创建COM组件的原理

IUnknown *pUnk = NULL; IObject *pObject = NULL; CoInitialize(NULL); CoCreateInstance(CLSID_Object...
  • CNHK1225
  • CNHK1225
  • 2015年12月31日 10:15
  • 901

COM组件原理

在COM中,接口就是一个象类,每个接口有一个接口ID(uuid)。一个COM组件通常是连续继承下来的类,比如 IUNknow ->IDispath->IXX->CXX。这就形成了一个COM组件,当然组...
  • wh_2396
  • wh_2396
  • 2017年08月30日 11:37
  • 237

COM组件注册真相

一个COM组件在使用前必须首先注册。所谓“注册”,也就是向系统注册表的相应位置写入一些数据。这些数据可以完成guid与Dll的绝对路径的一一对应,也就是说可以帮助程序通过guid找到Dll的位置。...
  • JasonLiao909
  • JasonLiao909
  • 2016年01月12日 17:37
  • 2851

启动COM组件的三种机制

这里的COM组件可以是一个进程内服务器(In-Process Server),也可以是一个进程外服务器(Out-Of-Process Server)。一般情况下,我们在使用这些COM组件的时候,只要保...
  • sunnylion1982
  • sunnylion1982
  • 2013年11月21日 17:24
  • 2126

COM组件注册方法(VC++)

1、打开VC的属性界面进行设置 2、注册DLL到系统 CString szInfo, szPath; char cPath[MAX_PATH] = {0}; GetModuleFileNam...
  • qing666888
  • qing666888
  • 2016年03月13日 23:30
  • 2579

不注册直接使用COM组件的方法

不注册直接使用COM组件的方法         1. 定义导出函数指针       [cpp] view plain copy //定义函...
  • cosmoslife
  • cosmoslife
  • 2016年09月29日 16:19
  • 477

COM组件开发知识重点——COM原理与应用篇(二)

第3章 COM的实现 3.1 进程内组件(DLL)的实现,可以参考DLL技术,主要参数为: 1)LoadLibrary:装载DLL模块 2)GetProcAddress:取引出函数的地址 3)Free...
  • guoduhua
  • guoduhua
  • 2016年04月08日 15:31
  • 595

COM 组件 (MFC 篇)、COM原理与应用

  • 2017年11月09日 11:16
  • 14.49MB
  • 下载

COM组件开发知识重点——COM原理与应用篇(一)

第1章 概述     COM组件可以是一个Dll(进程内组件),也可以是一个EXE(进程外组件)。进程内组件就是组件和客户程序在同一进程内,进程外组件即组件和客户程序分别有自己的进程空间。    ...
  • guoduhua
  • guoduhua
  • 2016年04月08日 15:30
  • 244

COM组件开发知识重点

第1章 概述    COM组件可以是一个Dll(进程内组件),也可以是一个EXE(进程外组件)。进程内组件就是组件和客户程序在同一进程内,进程外组件即组件和客户程序分别有自己的进程空间。    一...
  • wangjichang1
  • wangjichang1
  • 2014年09月15日 15:59
  • 485
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:COM组件开发知识重点——COM原理与应用篇(二)
举报原因:
原因补充:

(最多只允许输入30个字)