1. COM对象初始化

应用程序调用COM库中的函数(除CoGetMalloc和内存分配函数)之前必须初始化COM库。
COM初始化可以调用:
CoInitializeEx
CoInitializeEx可以指定COINIT_MULTITHREADED以多线程方式创建。
CoInitializeEx是 Windows提供的API函数,为当前线程初始化COM库并设置并发模式 。

函数原型:

HRESULT CoInitializeEx(void * pvReserved,DWORD dwCoInit);

参数介绍
pvReserved
系统保留的参数,必须传入 NULL.
dwCoInit
该标示指明基于当前线程的并发模式和初始化选项。该参数是 COINIT 枚举类型,传入参数时候,除了
COINIT_APARTMENTTHREADED 和COINIT_MULTITHREADED标记外,其余的标记可以组合使用。

返回值
S_OK :COM库初始化成功。
S_FALSE :当前线程上,COM库已经被初始化。
RPC_E_CHANGED_MODE :COM库已经被初始化且传入参数设置的并发模式和本次不同。

注意事项
① 在应用程序中使用COM库,至少要调用一次CoInitializeEx函数(通常也就调用一次)。
② 如果传入参数的并发标志相同,单个线程也可以多次调用该函数,但后来有效的调用将返回 S_FALSE。
③ 在正常关闭COM库情况下,每一个CoInitialize 或者CoInitializeEx的成功的调用(也包含返回S_FALSE的调用),都必须用通Uninitialize函数来结束。

使用方法

HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);

CoInitialize
CoInitialize指明以单线程方式创建。

函数原型

HRESULT CoInitialize(_In_opt_ LPVOID pvReserved);
//参数被保留,且必须为NULL。

返回值
S_OK : 该线程中COM库初始化成功
S_FALSE: 该线程中COM库已经被初始化 CoInitialize () 标明以单线程方式创建。

注意事项
① 使用 CoInitialize 创建可以使对象直接与线程连接,得到最高的性能。
② CoInitialize并不装载COM 库,它只用来初始化当前线程使用什么样的套件。使用这个函数后,线程就和一个套件建立了对应关系。线程的套件模式决定了该线程如何调用COM对象,是否需要列集等。
③ CoInitialize() 并不会干扰客户和服务器之间的通信,它所做的事情是让线程注册一个套件,而线程运行过程中必然在此套件。
④ CoInitialize和CoUninitialize必须成对使用。

2. 创建COM对象

函数:CoCreateInstance
函数功能
用指定的类标识符创建一个Com对象
创建组件的最简单的方法是使用CoCreateInstance函数。

函数原型

STDAPI CoCreateInstance(
REFCLSID rclsid, //创建的Com对象的类标识符(CLSID)
LPUNKNOWN pUnkOuter, //指向接口IUnknown的指针
DWORD dwClsContext, //运行可执行代码的上下文
REFIID riid, //创建的Com对象的接口标识符
LPVOID * ppv //用来接收指向Com对象接口地址的指针变量
);

函数参数
rclsid
[in] 用来唯一标识一个对象的CLSID(128位),需要用它来创建指定对象。
pUnkOuter
[in] 如果为NULL, 表明此对象不是聚合式对象一部分。如果不是NULL, 则指针指向一个聚合式对象的IUnknown接口。
dwClsContext
[in] 组件类别. 可使用CLSCTX枚举器中预定义的值。可选值:

相关的组合值:

riid
[in] 引用接口标识符,用来与对象通信。
ppv
[out] 用来接收指向接口地址的指针变量。如果函数调用成功,*ppv包括请求的接口指针。

返回值
S_OK:指定的Com对象实例被成功创建。
REGDB_E_CLASSNOTREG:指定的类没有在注册表中注册. 也可能是指定的dwClsContext没有注册或注册表中的服务器类型损坏
CLASS_E_NOAGGREGATION:这个类不能创建为聚合型。
E_NOINTERFACE:指定的类没有实现请求的接口, 或者是IUnknown接口没有暴露请求的接口.

先初始化,然后创建

HRESULT hr1 = CoInitialize(NULL);//单线程方式初始化COM对象
if ( FAILED( ret))cout << "未能初始化COM" << std::endl;
HRESULT hr2 = spObj.CoCreateInstance(OLESTR("XXXXX"), NULL, CLSCTX_INPROC_SERVER);
if ( FAILED( hr ))cout << "未能创建COM " << << endl;
return;}

3. 使用C++响应COM事件处理

要在C++中处理COM的事件,首先查询IConnectionPointContainer接口。然后调用接口上的FindConnectionPoint查找你需要的事件接口。然后使用IConnectionPoint::Advise将事件函数绑定到你自己的事件接口上去。如果不在使用。通过调用UnAdvice取消绑定。

7. COM编程——初始化并创建COM对象相关推荐

  1. 【Kotlin】Kotlin 构造函数 ( 主构造函数 | 主构造函数声明属性 | init 初始化代码块 | 次构造函数 | 构造函数委托 | 调用构造函数创建实例对象 )

    文章目录 I . 主构造函数 II . 主构造函数声明属性 III . init 初始化代码块 IV . 主构造函数参数 和 成员变量访问方式 V . 主构造函数 可见性 设置 VI . 次构造函数 ...

  2. MyBatis运行原理(三)接口式编程及创建代理对象原理分析

    一.面向接口开发步骤 定义代理接口,将操作数据库的方法定义在代理接口中. 在SQL 映射文件中编写SQL 语句. 将SQL 映射文件注册在MyBatis 的全局配置文件中. 编写测试代码. 二.环境准 ...

  3. 魔方APP项目-02-服务端项目搭建,创建manage.py文件、构建全局初始化函数创建app应用对象、通过终端脚本启动项目、项目加载配置、数据库初始化、日志初始化、蓝图初始化

    服务端项目搭建 新建项目目录mofangapi,并创建虚拟环境 mkvirtualenv mofang 安装开发中使用的依赖模块 pip install flask==0.12.4 pip insta ...

  4. Java网络编程从入门到精通(2):创建InetAddress对象的四个静态方法

    InetAddress类是Java中用于描述IP地址的类.它在java.net包中.在Java中分别用Inet4Address和Inet6Address类来描述IPv4和IPv6的地址.这两个类都是I ...

  5. Java网络编程从入门到精通(25):创建ServerSocket对象

    ServerSocket类的构造方法有四种重载形式,它们的定义如下: public ServerSocket() throws IOException public ServerSocket(int  ...

  6. 提高C++性能的编程技术笔记:临时对象+测试代码

    类型不匹配:一般情况是指当需要X类型的对象时提供的却是其它类型的对象.编译器需要以某种方式将提供的类型转换成要求的X类型.这一过程可能会产生临时对象. 按值传递:创建和销毁临时对象的代价是比较高的.倘 ...

  7. Python面向对象编程:入门类和对象

    前面写了文件的读取和文件处理等其他函数,里面用到了os库. 本来想分享os库,发现这个库可能对于初学者来说比较难,所以后面再等合适的时间谈谈,因为设计了很多文件系统的操作,比较偏Linux运维. 我们 ...

  8. 如何更好的创建Java对象

    2019独角兽企业重金招聘Python工程师标准>>> 静态工厂 除了使用构造函数创建对象外,还可以使用静态工厂来创建对象,JDK中大量使用了这种技巧,例如: public stat ...

  9. php面向对象编程开发,php面向对象编程之对象

    前面我们知道了什么叫类,以及知道了类有成员属性和成员方法,这一篇我们来认识一下对象. 对象是面向对象编程的单位,通过类可以实例化出许多对象,创建类的意义也就在于此.创建一个对象很简单,只需使用new关 ...

  10. Windows核心编程 第三章 内核对象

    第3章内核对象 在介绍Windows API的时候,首先要讲述内核对象以及它们的句柄.本章将要介绍一些比较抽象的概念,在此并不讨论某个特定内核对象的特性,相反只是介绍适用于所有内核对象的特性. 首先介 ...

最新文章

  1. dp cf 20190615
  2. php sql server配置文件路径,云服务器初始化 第六章:更改MySQL数据文件存放路径...
  3. 2021年7月份学习总结,多套WebFuture的系统部署(简易版)
  4. 洛谷3004 [USACO10DEC]宝箱Treasure Chest
  5. C# dataTable实用例
  6. 6.Linux 高性能服务器编程 --- 高级 I/O 函数
  7. WinPE启动U盘工具箱 (通用PE工具箱ISO映像文件)
  8. C语言入门项目篇:贪吃蛇(完整代码+详细注释)
  9. 破防了,原来这才是机房运维的正确方法
  10. 高德地图聚合自定义样式
  11. 人工智能数据集文本处理Onehot/TF/TFIDF矩阵的生成
  12. PR音频处理——音乐逐渐萎靡的效果
  13. Xcode7 网络请求报错:The resource could not be loaded be
  14. 怎么关闭计算机右侧的硬盘预览,选择性关闭视频文件预览 给Win7硬盘CPU减压
  15. 马化腾对短视频志在必得?腾讯又双叒叕发布了一款短视频App
  16. UltraEdit关闭自动备份
  17. html 注释 实例,超详细的HTML !–…– 注释标签使用实例
  18. 春分节气介绍PPT模板
  19. php相同数据合并单元格,jQuery_基于jQuery的合并表格中相同文本的相邻单元格的代码,ONE 已经生成的数据表格大致 - phpStudy...
  20. 面向对象设计原则之接口隔离原则

热门文章

  1. Vue.js目录结构
  2. 终端运行python报联网_终端里为什么无法运行python
  3. 关于Visual Studio “当前不会命中断点.还没有为该文档加载任何符号“的解决方法
  4. 给oracle数据库某一列数据的前面或者后面增加字符,合并两列的值
  5. CURL基于某个URL请求需要身份验证
  6. PHP调微信小程序接口:生成小程序码,常见问题
  7. 2019年三峡大学计算机考研名单,三峡大学2019硕士研究生复试录取方案
  8. 2022 github新建账号技巧
  9. LINUX文件图标变化:有时右键菜单刷新可以,有时需要重启机器
  10. error C2864 只有静态常量整型数据成员才可以在类中初始化