欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

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

发布时间:2025/3/20 编程问答 29 豆豆
生活随笔 收集整理的这篇文章主要介绍了 [转]COM对象创建-外部机制 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

 

所谓“外部机制”,指的是应用程序创建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对象了。

转载于:https://www.cnblogs.com/Quincy/archive/2010/03/25/1696169.html

总结

以上是生活随笔为你收集整理的[转]COM对象创建-外部机制的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。