现在的位置: 首页 > 综合 > 正文

[转]COM对象创建-外部机制

2012年10月06日 ⁄ 综合 ⁄ 共 1049字 ⁄ 字号 评论关闭

 

所谓“外部机制”,指的是应用程序创建ATL COM对象类厂的过程。应用程序并不关心COM对象是MFC实现方式的还是ATL实现方式的,它永远使用CoCreateInstance这类API函数,通过类厂创建COM对象。在ATL下,应用程序对CoCreateInstance的调用,是如何转换到对ATL COM对象类厂CreateInstance方法的调用的呢?

 

COM服务器

 

COM对象不能凭空存在,它必须存在于操作系统的某种可执行文件中。由于只有Windows操作系统支持COM规范,很自然地,COM对象存在于Windows操作系统的可执行文件中。

Windows操作系统的可执行文件,其格式主要有两种:EXEDLL。这里就不必要说这两种文件格式的区别了吧。如果不知道,这篇文章你估计也看不懂了。

能够生成COM对象的可执行程序叫COM服务器。EXE是进程外服务器,DLL是进程内服务器。这里只讨论DLL的情况。由于DLL本身只能通过对外输出的函数与外界交互,所以,DLL作为COM服务器也是通过四个输出函数来体现其服务器的作用。这就是著名的四个函数:

  • DllRegisterServer
  • DllUnregisterSever
  • DllGetClassObject
  • DllCanUnloadNow

 

COM服务器的工作机制可以用下图来表示:

 

 

 

COM服务器的重要功能可以归纳为三个:

  • 管理服务器的生命周期;
  • 管理服务器和对象的注册;
  • 获得COM对象的类厂

 

我们可以看到,作为COM服务器的DLL,用四个函数来完成这三个方面的功能。四个输出函数的调用时机分别如下:

  • DllRegisterServerDllUnregisterServer:使用regsvr32程序注册和反注册服务器时;
  • DllCanUnloadNow:当调用CoFreeUnusedLibraries系统函数时;
  • DllGetClassObject:从函数的字面意思来理解,应该是创建COM对象时该函数被调用。而我们知道创建COM对象的API函数是CoCreateInstanceCoCreateInstance是个封装函数,它包装了对CoGetClassObject,以及相应类厂CreateInstance函数的调用。CoGetClassObject通过注册表机制,找到相应的服务器,并且调用服务器的DllGetClassObject函数来获得类厂。一旦获得类厂对象,就可以调用类厂对象的CreateInstance方法来创建COM对象了。

抱歉!评论已关闭.