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,以及以下值。
返回代码 | 描述 |
---|---|
|
COM 库在此线程上已成功初始化。 |
|
COM 库已在此线程上初始化。 |
|
先前对 CoInitializeEx 的调用 为此线程指定了不兼容的并发模型。 这也可能表明发生了从中线单元到单线程单元的更改。 |
言论
对于使用 COM 库的每个线程,CoInitializeEx 必须至少调用一次,通常只调用一次。 允许同一线程 CoInitializeEx 的多个调用,只要它们传递相同的并发标志,但后续的有效调用将返回S_FALSE。 如果并发标志不匹配,则调用失败并返回RPC_E_CHANGED_MODE。 (出于此规则的目的,调用 CoInitialize 相当于使用 COINIT_APARTMENTTHREADED 标志调用 CoInitializeEx。若要在线程上正常初始化 COM 库,每次成功调用 CoInitialize 或 CoInitializeEx(包括返回S_FALSE的任何调用)都必须通过对 CoUninitialize的相应调用进行均衡。 在线程上取消初始化 COM 后,可以在任何模式下重新初始化它,但受上述约束的约束。
在调用除 CoGetMalloc之外的任何库函数之前,需要在线程上初始化 COM 库库,以获取指向标准分配器和内存分配函数的指针。 否则,COM 函数将返回CO_E_NOTINITIALIZED。
在单线程单元(STA)中创建的对象仅从其单元的线程接收方法调用,因此调用将序列化并仅到达消息队列边界(当调用 PeekMessage 或 SendMessage 函数时)。
在多线程单元 (MTA) 中 COM 线程上创建的对象必须能够随时接收来自其他线程的方法调用。 通常,使用同步基元(如关键节、信号灯或互斥体)在多线程对象的代码中实现某种形式的并发控制,以帮助保护对象的数据。
当配置为在中性线程单元(NTA)中运行的对象由位于 STA 或 MTA 中的线程调用时,该线程将传输到 NTA。 如果此线程随后调用 CoInitializeEx,则调用将失败并返回RPC_E_CHANGED_MODE。
由于 OLE 技术不是线程安全的,因此,OleInitialize 函数使用 COINIT_APARTMENTTHREADED 标志调用 CoInitializeEx。 因此,为多线程对象并发初始化的公寓不能使用 OleInitialize启用的功能。
由于无法控制进程内服务器加载或卸载的顺序,因此请不要从 DllMain 函数调用 CoInitialize、CoInitializeEx或 CoUninitialize。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | Windows 2000 Professional [桌面应用 |UWP 应用] |
支持的最低服务器 | Windows 2000 Server [桌面应用 |UWP 应用] |
目标平台 | 窗户 |
标头 | combaseapi.h (包括 Objbase.h) |
库 | Ole32.lib |
DLL | Ole32.dll |