zoukankan      html  css  js  c++  java
  • [转]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对象了。
  • 相关阅读:
    win7下64位系统memcache/memcached安装教程
    支付宝接口使用文档说明 支付宝异步通知(notify_url)与return_url.
    PHP使用DES进行加密解密
    使用PHP对文件进行压缩解压(zip)
    发一个天气预报接口
    使用php发送电子邮件(phpmailer)
    在线支付接口详解
    php 操作数组 (合并,拆分,追加,查找,删除等)
    PHP5中魔术方法
    Ehlib 学习
  • 原文地址:https://www.cnblogs.com/Quincy/p/1696169.html
Copyright © 2011-2022 走看看