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. COM笔记-类厂

    CoCreateInstance实际上并没有直接创建COM组件 ,而是创建了一个被称作是类厂的组件.而所需的组件正是由些类厂创建的.类厂组件的唯一功能就创建其他的组件.创建组件的标准接口是IClass ...

  2. 一个简单的DDraw应用程序

        阅读排行榜 1. C/C++ 笔试.面试题目大汇总(72915) 2. [STL]list基础(21718) 3. COM笔记-CoCreateInstance(14842) 4. C/C++ ...

  3. 【转】COM技术内幕(笔记)

    COM技术内幕(笔记) COM--到底是什么?--COM标准的要点介绍,它被设计用来解决什么问题?基本元素的定义--COM术语以及这些术语的含义.使用和处理COM对象--如何创建.使用和销毁COM对象 ...

  4. delphi操作xml学习笔记 之一 入门必读

    Delphi 对XML的支持---TXMLDocument类       Delphi7 支持对XML文档的操作,可以通过TXMLDocument类来实现对XML文档的读写.可以利用TXMLDocum ...

  5. git-简单流程(学习笔记)

    这是阅读廖雪峰的官方网站的笔记,用于自己以后回看 1.进入项目文件夹 初始化一个Git仓库,使用git init命令. 添加文件到Git仓库,分两步: 第一步,使用命令git add <file ...

  6. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  7. SQL Server技术内幕笔记合集

    SQL Server技术内幕笔记合集 发这一篇文章主要是方便大家找到我的笔记入口,方便大家o(∩_∩)o Microsoft SQL Server 6.5 技术内幕 笔记http://www.cnbl ...

  8. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  9. PHP-会员登录与注册例子解析-学习笔记

    1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...

随机推荐

  1. 「CF526F」 Pudding Monsters

    CF526F Pudding Monsters 传送门 模型转换:对于一个 \(n\times n\) 的棋盘,若每行每列仅有一个棋子,令 \(a_x=y\),则 \(a\) 为一个排列. 转换成排列 ...

  2. python使用笔记18--写日志

    1 import nnlog 2 import traceback 3 #level:输出日志级别,debug:把所有的日志都打印出来,info:打印info以上的日志, 4 # warning:打印 ...

  3. Git的安装和配置 -入门

    Git的版本有很多种,适应各种windows,IOS, Linux平台的安装. 我用的是linux Centos7的版本: 1. 安装命令用Yum, 非常简单就可以安装完毕. yum install ...

  4. HelloWord!

    HelloWorld 1.新建一个文件夹,存放代码 2.新建一个java文件后缀为.java Hello.java (注意后缀 如系统没打开显示后缀需要打开) 3.编写HelloWorld代码 (建议 ...

  5. 离散数学-传递闭包(POJ3275)

    就是n的元素给定m个关系求他们之间的关系. eg.  ∵a>b and b>c ∴a>c emmmm 若要知道n个元素的绝对关系,则需知道C(n,2)个关系. 例题:POJ3275 ...

  6. python 连接mysql数据库操作

    import pymysql.cursors # 连接数据库 connect = pymysql.Connect( host='localhost', port=3306, user='root', ...

  7. argparse模块基本用法

    argparse模块基本用法 在 python 编写的程序中,我们经常会看到的 argparse 相关代码,而它究竟怎么使用呢?接招! argparse 是一个命令行参数解析模块 现在提出需求,我需要 ...

  8. vue目首屏添加skeleton骨架屏

    1. 安装插件:npm install vue-skeleton-webpack-plugin 2. 在src目录下创建 Skeleton.vue <template> <div c ...

  9. OpenGL学习笔记(四)纹理

    目录 要完成的纹理效果 纹理环绕方式 纹理过滤 多级渐远纹理 加载与创建纹理 stb_image库的使用方法 生成纹理对象 应用纹理 纹理单元 参考资料:OpenGL中文翻译 要完成的纹理效果 纹理是 ...

  10. 简单的整合 shiro + SpringMVC 例子

    简单的整合shiro和springmvc的例子 想要整合Shiro和springmvc,在网上找了很多例子,感觉都有一点复杂.所以就自己写了一个最简单整合项目,记录在这里以备后面查看. 这个例子包含如 ...