`
chinamming
  • 浏览: 140808 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

CoCreateInstance具体内部实现

 
阅读更多
  1. CoCreateInstance(....)
  2.     {
  3.     //.......
  4.     IClassFactory*pClassFactory=NULL;
  5.     CoGetClassObject(CLSID_Object,CLSCTX_INPROC_SERVER,NULL,IID_IClassFactory,(void**)&pClassFactory);
  6.     pClassFactory->CreateInstance(NULL,IID_IUnknown,(void**)&pUnk);
  7.     pClassFactory->Release();
  8.     //........
  9.    }

  这段话的意思就是先得到类厂对象,再通过类厂创建组件从而得到IUnknown指针。继续深入一步,看看CoGetClassObject的内部伪码:

   
  1. CoGetClassObject(.....)
  2.    {
  3.     //通过查注册表CLSID_Object,得知组件DLL的位置、文件名
  4.     //装入DLL库
  5.     //使用函数GetProcAddress(...)得到DLL库中函数DllGetClassObject的函数指针。
  6.     //调用DllGetClassObject
  7.    }
  8.    /// DllGetClassObject是干什么的,它是用来获得类厂对象的。只有先得到类厂才能去创建组件.
  9.    /// 下面是DllGetClassObject的伪码:
  10.     DllGetClassObject(...)
  11.     {
  12.     //......
  13.     CFactory*pFactory=newCFactory;//类厂对象
  14.     pFactory->QueryInterface(IID_IClassFactory,(void**)&pClassFactory);
  15.     //查询IClassFactory指针
  16.     pFactory->Release();
  17.     //......
  18.     }
  19.    /// CoGetClassObject的流程已经到此为止,现在返回CoCreateInstance,看看CreateInstance的伪码:
  20.     CFactory::CreateInstance(.....)
  21.     {
  22.     //...........
  23.     CObject*pObject=newCObject;//组件对象
  24.     pObject->QueryInterface(IID_IUnknown,(void**)&pUnk);
  25.     pObject->Release();
  26.     //...........
  27.     }

这部分我们将构造一个创建COM组件的最小框架结构,然后看一看其内部处理流程是怎样的

  1.     IUnknown*pUnk=NULL;
  2.     IObject*pObject=NULL;
  3.     CoInitialize(NULL);
  4.     CoCreateInstance(CLSID_Object,CLSCTX_INPROC_SERVER,NULL,IID_IUnknown,(void**)&pUnk);
  5.     pUnk->QueryInterface(IID_IOjbect,(void**)&pObject);
  6.     pUnk->Release();
  7.     pObject->Func();
  8.     pObject->Release();
  9.     CoUninitialize();


  1. CoCreateInstance(....)
  2.  {
  3.     .......
  4.     IClassFactory*pClassFactory=NULL;
  5.     CoGetClassObject(CLSID_Object,CLSCTX_INPROC_SERVER,NULL,IID_IClassFactory,(void**)&pClassFactory);
  6.     pClassFactory->CreateInstance(NULL,IID_IUnknown,(void**)&pUnk);
  7.     pClassFactory->Release();
  8.     ........
  9.  }

  这就是一个典型的创建COM组件的框架,不过我的兴趣在CoCreateInstance身上,让我们来看看它内部做了一些什么事情。以下是它内部实现的一个伪代码:

  1.   CoGetClassObject(.....)
  2.    {
  3.     //通过查注册表CLSID_Object,得知组件DLL的位置、文件名
  4.     //装入DLL库
  5.     //使用函数GetProcAddress(...)得到DLL库中函数DllGetClassObject的函数指针。
  6.     //调用DllGetClassObject
  7.    }
  8.     DllGetClassObject是干什么的,它是用来获得类厂对象的。只有先得到类厂才能去创建组件.
  9.     下面是DllGetClassObject的伪码:
  10.     DllGetClassObject(...)
  11.     {
  12.     ......
  13.     CFactory*pFactory=newCFactory;//类厂对象
  14.     pFactory->QueryInterface(IID_IClassFactory,(void**)&pClassFactory);
  15.     //查询IClassFactory指针
  16.     pFactory->Release();
  17.     ......
  18.     }
  19.     CoGetClassObject的流程已经到此为止,现在返回CoCreateInstance,看看CreateInstance的伪码:
  20.     CFactory::CreateInstance(.....)
  21.     {
  22.     ...........
  23.     CObject*pObject=newCObject;//组件对象
  24.     pObject->QueryInterface(IID_IUnknown,(void**)&pUnk);
  25.     pObject->Release();
  26.     ...........
  27.     }

  这段话的意思就是先得到类厂对象,再通过类厂创建组件从而得到IUnknown指针。继续深入一步,看看CoGetClassObject的内部伪码:


  

上图是从COM+技术内幕中COPY来的一个例图,从图中可以清楚的看到CoCreateInstance的整个流程。

  (7) 一个典型的自注册的COM DLL所必有的四个函数

  DllGetClassObject:用于获得类厂指针
  DllRegisterServer:注册一些必要的信息到注册表中
  DllUnregisterServer:卸载注册信息
  DllCanUnloadNow:系统空闲时会调用这个函数,以确定是否可以卸载DLL

  DLL还有一个函数是DllMain,这个函数在COM中并不要求一定要实现它,但是在VC生成的组件中自动都包含了它,它的作用主要是得到一个全局的实例对象。

  (8) 注册表在COM中的重要作用

  首先要知道GUID的概念,COM中所有的类、接口、类型库都用GUID来唯一标识,GUID是一个128位的字串,根据特制算法生成的GUID可以保证是全世界唯一的。 COM组件的创建,查询接口都是通过注册表进行的。有了注册表,应用程序就不需要知道组件的DLL文件名、位置,只需要根据CLSID查就可以了。当版本升级的时侯,只要改一下注册表信息就可以神不知鬼不觉的转到新版本的DLL。

分享到:
评论

相关推荐

    COM笔记-CoCreateInstance

    COM笔记-CoCreateInstance 很有用的 开发参考 比如 CoCreateInstance(CLSID_VideoRenderer,0,CLSCTX_ALL,IID_IBaseFilter,(void**)&pPreview);这里面的参数是什么意思 ?这个文档可以告诉你。。 欢迎联系:393877568

    COM技术内幕+COM原理与应用part1

    贡献两本COM技术的两本经典的书籍,两本书的风格不太一样,看个人口味吧。谢谢下载!

    易语言COM编程接口演示

    COM编程接口演示,取指针_整数,取指针_字节集,A2W,Unicode转Ansi,GetRunPath,SetWindowText,CallPointer,AddPush,AddCall,AddLong,AddByte,GetWallpaper,SetWallpaper,IIDFromString,CoCreateInstance,CallWindowProc...

    TAPI 3.0 Application development using C#.NET

    TAPI3.0 C#例子,用电脑打电话。

    易语言墙纸操作

    易语言墙纸操作源码系统结构:取变量地址,到可变字符,运行子程序,到宽字符,读数,设置墙纸,CoCreateInstance,IIDFromString,CoInitialize,StringFromIID,MultiByteToWideChar,取文本地址,取字节集地址,取整数

    深入COM服务器.doc

    • 深 入CoCreateInstance()——探究CoCreateInstance()的调用机理 • COM 服务器的注册——描述完成服务器注册所需要的注册表入口 • 创 建COM对象——类工厂——描述创建客户端要使用的COM对象的过程 • 一 个定制...

    FileMonitor.rar 在MFC中实现 EventSink

    具体查 MSDN --IDispEventImpl (2) 添加映射项 BEGIN_SINK_MAP(CFileMonitorSink) SINK_ENTRY_EX( 0, __uuidof(_IFun1Events), 1, OnNotify) //0 唯一标识符,用于区别 连接到 事件源的多个客户端 同上 , 1, ...

    WIN32 COM组件 的实现及注册

    通过一个简单的组件实现两个接口,CoCreateInstance 调用 DLLGetClassObject返回相应的组件类厂 类厂调用CreateInstance创建组件 用DLLRegisterServer向注册表中加一个组件ID,前提是要对注册表中CLSID下的结构有...

    vc mfc 基于directshow实现usb摄像头预览拍照及下载图片的例子

    vc mfc 基于directshow实现usb摄像头预览拍照及下载图片 ,以调用CoCreateInstance创建一个新的捕获Graph Builder和Filter Graph Manager开始。随后通过给定Filter Graph Manager的IgraphBuilder接口指针作为参数...

    COM技术内幕——微软组件对象模型--随书源代码

    7.2.3 CoCreateInstance与CoGetClassObjet的比较 109 7.2.4 类厂的若干特性 110 7.3 类厂的实现 110 7.3.1 DllGetClassObject的使用 111 7.3.2 组件的创建过程 111 7.3.3 组件代码清单 112 7.3.4 流程控制 ...

    易语言COM组件支持模块全套源码-易语言

    易语言COM组件支持模块全套源码

    include头文件

    c c++头文件集合

    使用OPC SI7 S7-300与iFIX 通讯.pdf

    使用OPC SI7 S7-300与iFIX 通讯pdf,使用OPC SI7 S7-300与iFIX 通讯

    vb6动态加载DLLCOM对象-CoCreateInstanceEx中国第一个

    vb6之CoCreateInstanceEx加载Com对象中国第一个,其他下载的全是VC++等代码,外国网站不让访问,我们百度能搜到的全是旧信息,中国这样怎么发展?

    XMLHttpRequest中文参考手册(15)

    XMLHttpRequest中文参考手册(15)

    delphi的com机制

    CoCreateInstance / CoCreateInstanceEx 函数 COM 库的初始化 COM 库的内存管理 组件程序的装载和卸载 COM 库常用函数 HRESULT 类型 ⊙ 第四章 COM 特性 可重用性:包容和聚合 进程透明性 (待学) 安全性 ...

    ATL 揭秘之“对象创建”篇

    当我们用VC++ ATL 工程创建了一个COM 工程,实现了一个自己的COM 对象,又在另一个程序中CoCreateInstance 这个COM 对象时,不知你是否想过这样的问题:COM 对象是用C++类对象实现的,但是,我们从来没有在自己的...

    Visual C++实践与提高-COM和COM+篇『PDF』

    3.4.1.2 CoCreateInstance 3.4.1.3 CoCreateInstanceEx 3.4.2 如何调用进程内组件 3.4.3 COM客户调用进程外组件 3.5 进一步认识COM 3.5.1 可重用机制:包容和聚合 3.5.2 进程透明性 3.5.3 安全性机制 小结 第4章 ...

    C++中COM组件初始化方法实例分析

    具体如下: 这里使用BCB 在使用TADOConnect等组件时需要进行初始化 调用接口 : CoInitialize(NULL);//初始化COM套件 CoUninitialize();//释放COM套件 在DLL入口中调用: static bool isCoInitialize = false; //...

    srcUDiskCpyManager_V2013_1012_1653.rar_dlp_hook_ifileoperation_w

    防止向U盘中拷贝文件, Hook Win32API, 实现在WinXp下U盘 DLP Hook函数列表:CopyFileExW Win7(x86/x64)下U盘DLP Hook函数列表: CoCreateInstance, IFileOperation::CopyItems IFileOperation::MoveItems ...

Global site tag (gtag.js) - Google Analytics