7. COM编程——初始化并创建COM对象

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取消绑定。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值