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 的调用 为此线程指定了不兼容的并发模型。 这也可能表明发生了从中线单元到单线程单元的更改。

言论

对于使用 COM 库的每个线程,CoInitializeEx 必须至少调用一次,通常只调用一次。 允许同一线程 CoInitializeEx 的多个调用,只要它们传递相同的并发标志,但后续的有效调用将返回S_FALSE。 如果并发标志不匹配,则调用失败并返回RPC_E_CHANGED_MODE。 (出于此规则的目的,调用 CoInitialize 相当于使用 COINIT_APARTMENTTHREADED 标志调用 CoInitializeEx。若要在线程上正常初始化 COM 库,每次成功调用 CoInitializeCoInitializeEx(包括返回S_FALSE的任何调用)都必须通过对 CoUninitialize的相应调用进行均衡。 在线程上取消初始化 COM 后,可以在任何模式下重新初始化它,但受上述约束的约束。

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

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

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

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

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

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

要求

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

另请参阅

进程、线程和单元