COM工作过程示意(一):进程内组件

原创 2007年09月14日 16:55:00

 

这不算一篇纯粹的原创作品,这是我对《COM原理及应用》的一点整理。欢迎发表评论,当然还有后续。

Client

COM

ComponentDLL

CoInitialize(NULL),每个线程都得来一次,初始化该线程COM库。

 

我知道要调用组件的名称叫“Dictionary.Object”,

但我得知道这个名称对应的CLSID,所以我调用CLSIDFromProgID("Dictionary.Object",&clsid)来获取。

 

 

 

 

有了CLSID,我现在就想操作组件,所以我要创建一个组件的对象,其实我并不关心这个对象的具体创建的过程,可能这个对象已经存在,可能还要加载,但我并不关心,这一切对我来说是透明的,我的“创建”办法就是先获得生产这个对象的“工厂”:CoGetClassObject(clsid, CLSCTX_INPROC_SERVER, NULL, IID_IClassFactory, (void **)&pClf);我所要得到的是这个组件对象的指针,也就是pClf

 

 

 

 

 

 

 

 

 

 

 

 

其实我也知道,刚刚这步获得的只是工厂,还不是真正的对象,现在得用这个工厂创建一个真正的对象了。pClf->CreateInstance(NULL, IID_IUnknown, (void **)&pUnknown);

 

 

 

 

 

对象创建起来了,工厂没什么用了,释放它,pClf->Release();pUnknown有值了,这才是我想要的,现在,通过pUnknown做该做的事情吧。

 

怎么做?简单,事先我已经知道了这个接口“IDictionary”,所以pUnknown->QueryInterface (IID_Dictionary, (void **) &pDictionary); pDictionary是我真正要使用的东西。

pDictionary->GetAWord(…);

 

pDictionary->SpellCheck(…);

 

好了,用完了,做事情要有头有尾,Release,调用了多少次QueryInterface()对应Release()。如上例,应该调用pDictionary->Release()

 

当然了,确定pUnknown不再使用之后也得ReleasepUnknown->Release()

 

 

 

 

COM库一阵子不做事情了,现在给点东西它做。我调CoFreeUnusedLibraries()

 

 

 

 

 

 

CoUninitialize(),对应开头的CoInitialize()

 

 

Ready

 

 

 

 

CLSIDFromProgID是我COM库的一个函数,其实我要做的事情就是从注册表中找出“Dictionary.Object”CLSID,然后返回给Client

 

 

 

 

 

 

 

 

好吧,让我看看,嗯,你要的组件对应DictComp.dll这个文件,还没被加载,我现在CoLoadLibrary它(MSDN上说CoGetClassObject并不调用CoLoadLibrary,我没怎么看明白,希望知情人解释一下。)。我一视同仁,加载完毕后调用这个dll的导出函数“DllGetClassObject”。

 

 

 

 

这一步我就“无为”吧,直接把IClassFactory返回给Client

 

 

 

 

(悄悄话:Client直接掉用pClf的方法,则回可没通过我的处理)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

好,我调ComponentDllCanUnloadNow

 

 

 

 

Component那边返回TRUECoFreeLibrary它吧。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

终于轮到我了,DllGetClassObject是我的函数,根据Microsoft这套规范,我实现了工厂类CDictionaryFactory,现在我创建这么一个工厂类,把它的接口IClassFactory返回给COM库。

 

 

 

 

 

 

 

 

我的工厂的“CreateInstance”被Client调用,OK,我来new一个CDictionary吧,并返回它的指针IUnknown

 

 

 

 

 

 

 

 

 

返回一个单词的。

 

检查单词拼写。

 

 

 

收到收到,CDictionary对象的ref--

 

 

收到,由于pUnknown也是指向CDictionary对象,所以还是,CDictionary对象的ref--

(悄悄话:每次ref--,我都会检查ref是否为0,如果是,则删除该CDictionary对象)

 

 

 

DllCanUnloadNow()是我导出的一个函数,用这个函数检查我这个模块是不是所有的对象都被delete了?如果是,那我的使命就结束了,我就可以被T出内存了。

 

 

 

com组件的进程源码

  • 2013年12月13日 10:08
  • 44KB
  • 下载

COM/DCOM开发之远程进程外组件(DCOM)

一 目的 使用VC++的ATL编程实现远程进程外组件。同时实现客户端这些组件的调用。二 要求 1)使用C++语言实现远程进程外组件,组建提供加、减、乘、除、判断是否素数等计算服务;客户端部分包括录入和...

[解决]VS2010尝试设置 IDE 的进程内编译器的“References”参数时出现问题。对 COM 组件的调用

今天新开了博客,欢迎大家来交流,如有不妥或错漏欢迎指出。 之所以写这个博客是因为开发过程中许多问题都找不到解决方案,特别是做android的毕业设计是一大堆问题在csdn都没找到解决方法,最后自己捣鼓...
  • windfz
  • windfz
  • 2016年09月05日 11:44
  • 1902

10.COM进程外组件和列集、散集

前面讲的都是进程内组件,实际上COM是进程透明的,就是使用COM的时候,不管当前连接的是进程内组件还是进程外组件,使用方法一样,所有的差异都被COM中间屏蔽了。这一节详细讲解COM进程外组件的列集/散...

12.编写COM进程外组件

相比进程内组件,进程外组件的编写较为麻烦,在前面已经讲的IDL和进程外组件原理基础上,本节以一个简单实例讲解进程外组件的编写步骤和注意事项。...

C#调用COM组件后退出Excel进程

我在使用WinForm程序调用Excel的COM组件的时候,也遇到了Excel进程退出的问题。这个问题很多人已经遇到,而且解决办法也吵得很热。 现在总结一下: 第一种方法是调用相关的组件释放方法,...

COM/DCOM开发练习之进程内组件实例

1)使用C++语言实现进程内组件,组建提供加、减、乘、除、判断是否素数等计算服务;客户端部分包括录入和查询部分。 2)在VC++环境上利用ATL向导进行开发。      1.进程内组件   服务器端:...

COM进程外组件的实现vc++

说明进程外组件的实现有三个部分组成分别是: 进程外组件:com_test->simple(接口) 代理存根  :com_proxy 客户端    :com_client 开发环境:WIN7...
  • dasgk
  • dasgk
  • 2013年05月30日 10:27
  • 2270
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:COM工作过程示意(一):进程内组件
举报原因:
原因补充:

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