CoCreateInstance

创建组件的最简单的方法是使用CoCreateInstance函数。

在COM库中包含一个用于创建组件的名为CoCreateInstance的函数。此函数需要一个CLSID参数,在此基础上创建相应组件的一个实例,并返回此组件的某个接口。

CoCreateInstance 的声明

HRESULT _stdcall  CoCreateInstance(REFCLSID rclsid,

LPUNKNOWN pUnkOuter,

DWORD dwClsContext,

REFIID riid,

LPVOID * ppv);

第一个参数:待创建组件的CLSID。

第二个参数:用于聚合组件。

第三个参数:dwClsContext的作用是限定所创建的组件的执行上下文。

第四个参数:iid为组件上待使用的接口的iid。

CoCreateInstance 将在最后一个参数中返回此接口的指针。通过将一个IID传给CoCreateInstance,客户将无需在创建组件之后去调用 其QueryInterface函数。

CoCreateInstance的实现

HRESULT CoCreateInstance(const CLSID& clsid,IUnknown* punkonwnDuter,DWORD dwClsContext,const IID& iid,void** ppv) {// Set the out paameter to NULL *ppv = NULL;// Create the class factory // and get an IClassFactroy interface pointer. IClassFactory* pIFactory = NULL;HRESULT hr = CoGetClassObject(clsid,dwClsContext,NULL,IID_IClassFactory,(void**)&pIFactory);if (SUCCEEDED(hr)){// create the component. hr = pIFactory->CreateInstance(punkonwnDuter, iid, ppv);pIFactory->Release()();}return hr; }

CoCreateInstance的使用

// Create component.

IX *pIX = NULL;

HRESULT hr = ::CoCreateInstance(CLSID_Companent1,

NULL,

CLSCTX_INPROC_SERVER,

IID_IX,

(void **)&pIX);

if (SUCCEEDED(hr))

{

pIX->Fx();

pIX->Release();

}

CLSCTX_INPROC_SERVER值告诉CoCreateInstance只装载包含进程中服务器或DLL中的组件。

类上下文

CoCreateInstance的第三个参数dwClsContext可以控制所创建的组件是在与客户相同的进程中运行,还是在不同的进程中运行,或者是在另外一台机器上运行。

CLSCTX_INPROC_SERVER

客户希望创建在同一进程中运行的组件。为能够同客户在同一进程中运行,组件必须是在DLL中实现。

CLSCTX_INPROC_HANDLER

客户希望创建进程中处理器。一个进程中处理器实际上是一只实现了某个组件一部分的进程中组件。该组件的基体附录将由本地或远程服务器上的某个进程外组件实现。

SLSCTX_LOCAL_SERVER

客户希望创建一个在同一机器上的另外一个进程中运行的组件。本地服务器是由EXE实现的。

SLSCTX_REMOTE_SERVER

客户希望创建一个在远程机器上运行的组件。此标志需要分布式COM正常工作。

执行上下文标记的一些预定义组合

常量名称

CLSCTX_INPROC

CLSCTX_INPROC_SERVER

CLSCTX_INPROC_HANDLER

CLSCTX_ALL

CLSCTX_INPROC_SERVER

CLSCTX_INPROC_HANDLER

SLSCTX_LOCAL_SERVER

SLSCTX_REMOTE_SERVER

CLSCTX_SERVER

CLSCTX_INPROC_SERVER

SLSCTX_LOCAL_SERVER

SLSCTX_REMOTE_SERVER

另外要说明的是,CLSCTX_REMOTE_SERVER值只是在包含OBJEBASE.H之前将_WIN32_WINNT的值定义为大于或等于0x0400时才会被加到CLSCTX_ALL和CISCTX_SERVER中(在包含OBJEBASE.H之前定义_WIN32_DCOM的效果将是一样的。)若在某个不支持DCOM的系统中将CLSCTX_REMOVE_SERVER值会以给CoCreateInstance,此函数将会失败并返回一个E_INVALIDARG值。

CoCreateInstance例子

跟之前的区别在于客户创建组件时使用的是::CoCreateInstance,还用了CoInitialize和CoUninitialize来初始化COM库。

http://www.cnblogs.com/fangyukuan/archive/2010/04/09/1708651.html

#include "stdafx.h" #include<iostream>using namespace std; #include "http://www.cnblogs.com/ATLComDemo/ATLComDemo/ATLComDemo_i.c" #include "http://www.cnblogs.com/ATLComDemo/ATLComDemo/ATLComDemo_i.h"int _tmain(int argc, _TCHAR* argv[]) {//声明HRESULT和Ikuan接口指针 Ikuan * IkuanATL = NULL;HRESULT hr = CoInitialize(NULL); //初始化COM//使用SUCCEEDED宏并检查我们是否能得到一个接口指针 if(SUCCEEDED(hr)){hr = CoCreateInstance(CLSID_kuan,NULL,CLSCTX_INPROC_SERVER,IID_Ikuan,(void **)&IkuanATL);//如果成功,则调用AddNumbers方法,否则显示相应的出错信息 if(SUCCEEDED(hr)){long ReturnValue;IkuanATL->Add(8,9,&ReturnValue);cout << "The answer for 8+9 is:" << ReturnValue << endl;IkuanATL->Release();}else{cout << "CoCreateInstance Failed." << endl;}}CoUninitialize();//释放COM return 0; }

CoCreateInstance的不灵活性

CoCreateInstance创建组件的过程是:传给它一个CLSID,然后创建相应的组件,并返回 指向所请求的接口指针。它没有给客户提供一种能够控制组件创建过程的方法。

当CoCreateInstance完成之后,组件实际上已经建立好了。在建立好一个组件之后,想要控制将组件装载到内存中何处或检查客户是否有来创建该组件基本上已经不可能了。

本文地址:http://www.cnblogs.com/fangyukuan/archive/2010/06/11/1756724.html

COM笔记-CoCreateInstance相关推荐

  1. (转载)视频采集学习笔记

    视频采集学习笔记 第一节.视频采集   一.二者的不同点: 说起视频捕捉问题,我们先要来看一下视频捕捉卡.根据使用的驱动程序的不同来分类,目前市场上大致有两种捕捉卡:VFW (Video for Wi ...

  2. 《COM技术内幕》笔记(1)

    <COM技术内幕>笔记(1) <COM技术内幕>笔记(1) 第1章 组件 1.COM,即组件对象模型,是关于如何建立组件以及如何通过组件建构应用程序的一个规范. 2.组件的优点 ...

  3. 读书笔记 来自网络

    2010年3月15日 # <深入解析MFC>笔记 12. 进程与线程 2009-10-7 ======================= <深入解析MFC>笔记 12. 进程与 ...

  4. DirectShow开发笔记与问题记录(2018.3.12更新)

    本博文主要记录本人在使用DirectShow框架,进行播放器.流媒体处理开发过程中遇到的问题以及解决的方法.一方面作为笔记,方便日后参考,另一方面也记录一些疑难杂症,供大家查询. 问题: 1.使用Qt ...

  5. 读书笔记之《格蠹汇编-软件调试案例集锦》

    最近张银奎大侠出新书<格蠹汇编-软件调试案例集锦> 迫不及待买回来看了下,确实是好书,行如流水,看如小说,有慎怕一下看完了之想,学习之余写下读书笔记便于以后查询. 1.编辑博客时,编辑的内 ...

  6. [置顶]       读书笔记之《格蠹汇编-软件调试案例集锦》

    最近张银奎大侠出新书<格蠹汇编-软件调试案例集锦> 迫不及待买回来看了下,确实是好书,行如流水,看如小说,有慎怕一下看完了之想,学习之余写下读书笔记便于以后查询. 1.编辑博客时,编辑的内 ...

  7. 【读书笔记】知易行难,多实践

    前言: 其实,我不喜欢看书,只是喜欢找答案,想通过专业的解答来解决我生活的困惑.所以,我听了很多书,也看了很多书,但看完书,没有很多的实践,导致我并不很深入在很多时候. 分享读书笔记: <高效1 ...

  8. 【运维学习笔记】生命不息,搞事开始。。。

    001生命不息,搞事不止!!! 这段时间和hexesdesu搞了很多事情! 之前是机械硬盘和固态硬盘的测速,我就在那默默的看着他一个硬盘一个机械测来测去. 坐在他后面,每天都能看到这位萌萌的小男孩,各 ...

  9. SSAN 关系抽取 论文笔记

    20210621 https://zhuanlan.zhihu.com/p/353183322 [KG笔记]八.文档级(Document Level)关系抽取任务 共指id嵌入一样 但是实体嵌入的时候 ...

最新文章

  1. JDBC Driver常用连接方法列表
  2. C++ Primer 5th笔记(chap 17 标准库特殊设施)IO库 之操纵符
  3. 图片热区map-area
  4. Win10系统添加 Win10 LTSC2019闹钟
  5. 服务器基线加固脚本_Linux 基线检查,安全加固脚本
  6. 开启springboot中对jsp页面修改后的热部署
  7. C语言:编写一个程序,建立一个abc.txt文本文件,向其中写入“this is a test”,然后显示该字符串
  8. 写了一套优雅接口之后,领导让我给大家讲讲这背后的技术原理
  9. 艾永亮:这家酒店如何让你毫不犹豫点上五星好评?
  10. 项目十大管理和五大过程组
  11. python函数之间变量的调用
  12. springcloud微服务学习笔记(四十五):Gateway9527搭建
  13. Java多线程系列--【JUC集合02】- CopyOnWriteArrayList
  14. 北京大学计算机同等学力申硕信息平台,北京大学同等学力申硕有哪些专业?
  15. CSRF, XSS攻击
  16. 中国酒店周刊 | 上海万信福朋喜来登、包头茂业万豪、武汉江夏万枫酒店开业...
  17. 操作系统实验报告(二)银行家算法
  18. InnoDB存储引擎中有页(Page)的概念
  19. 知网、维普、万方文献一网打尽免费下载,亲测好用哦!
  20. Android 开源项目及库汇总(2)

热门文章

  1. sqlserver2005表转到mysql数据库
  2. 【小练习01】CSS--PS提示框制作
  3. 【JavaSE05】Java中方法与重载、递归-练习
  4. python有多少关键字_Python挖词脚本,挖出几十万关键词不是梦带搜索量
  5. 密码学:RSA加密算法详解
  6. Netty之十大核心模块组件介绍
  7. 代理模式(Proxy)简介
  8. ar9344 9382 8035 编程器固件_沈阳熔铜炉设计,紧固件加热炉_宏祥电炉
  9. c语言退出程序命令_C语言#error命令,阻止程序编译
  10. 一文读懂 Shell 中各种括号的作用