CoInitializeEx 函数 (combaseapi.h)

初始化 COM 库供调用线程使用,设置线程的并发模型,并根据需要为线程创建一个新单元。

如果要使用 Windows 运行时 API,或者想要同时使用 COM 和 Windows 运行时 组件,则应调用 Windows::Foundation::Initialize 来初始化线程,而不是 CoInitializeEx。 Windows::Foundation::Initialize 足以用于 COM 组件。

语法

HRESULT CoInitializeEx(
  [in, optional] LPVOID pvReserved,
  [in]           DWORD  dwCoInit
);

参数

[in, optional] pvReserved

此参数是保留的,必须为 NULL

[in] dwCoInit

线程的并发模型和初始化选项。 此参数的值取自 COINIT 枚举。 可以使用 COINIT 中值的任意组合,但不能同时设置COINIT_APARTMENTTHREADED和COINIT_MULTITHREADED标志。 默认值为 COINIT_MULTITHREADED。

返回值

此函数可以返回标准返回值E_INVALIDARG、E_OUTOFMEMORY和E_UNEXPECTED,以及以下值。

返回代码 说明
S_OK
COM 库已在此线程上成功初始化。
S_FALSE
COM 库已在此线程上初始化。
RPC_E_CHANGED_MODE
先前调用 CoInitializeEx 将此线程的并发模型指定为多线程单元 (MTA) 。 这也可能表明发生了从中性线程单元到单线程单元的更改。

注解

对于使用 COM 库的每个线程,CoInitializeEx 必须至少调用一次,并且通常只调用一次。 只要同一线程传递相同的并发标志,就允许对 CoInitializeEx 进行多次调用,但后续有效调用将返回S_FALSE。 若要在线程上正常关闭 COM 库,每次成功调用 CoInitializeCoInitializeEx(包括任何返回S_FALSE的调用)都必须通过对 CoUninitialize 的相应调用来平衡。

在调用 除 CoGetMalloc 之外的任何库函数之前,需要在线程上初始化 COM 库,以获取指向标准分配器和内存分配函数的指针。

否则,COM 函数将返回CO_E_NOTINITIALIZED。

设置线程的并发模型后,无法更改该模型。 在以前初始化为多线程的单元上调用 CoInitialize 将失败并返回RPC_E_CHANGED_MODE。

在单线程单元中创建的对象 (STA) 只从单元的线程接收方法调用,因此调用是序列化的,并且仅在) 调用 PeekMessageSendMessage 函数时到达消息队列边界 (。

在多线程单元 (MTA) 的 COM 线程上创建的对象必须能够随时接收来自其他线程的方法调用。 通常会使用同步基元(如关键部分、信号灯或互斥体)在多线程对象的代码中实现某种形式的并发控制,以帮助保护对象的数据。

当配置为在非特定线程单元 (NTA) 中运行的对象由 STA 或 MTA 中的线程调用时,该线程将传输到 NTA。 如果此线程随后调用 CoInitializeEx,则调用将失败并返回RPC_E_CHANGED_MODE。

由于 OLE 技术不是线程安全的,因此 OleInitialize 函数使用 COINIT_APARTMENTTHREADED 标志调用 CoInitializeEx 。 因此,为多线程对象并发初始化的单元无法使用 OleInitialize 启用的功能。

由于无法控制加载或卸载进程内服务器的顺序,因此请勿从 DllMain 函数调用 CoInitializeCoInitializeExCoUninitialize

要求

要求
最低受支持的客户端 Windows 2000 专业版 [桌面应用 |UWP 应用]
最低受支持的服务器 Windows 2000 Server [桌面应用 |UWP 应用]
目标平台 Windows
标头 combaseapi.h (包括 Objbase.h)
Library Ole32.lib
DLL Ole32.dll

另请参阅

进程、线程和单元