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

请参阅

进程、线程和单元