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 将此线程的并发模型指定为多线程单元 (MTA) 。 这也可能表明发生了从中性线程单元到单线程单元的更改。 |
注解
对于使用 COM 库的每个线程,CoInitializeEx 必须至少调用一次,并且通常只调用一次。 只要同一线程传递相同的并发标志,就允许对 CoInitializeEx 进行多次调用,但后续有效调用将返回S_FALSE。 若要在线程上正常关闭 COM 库,每次成功调用 CoInitialize 或 CoInitializeEx(包括任何返回S_FALSE的调用)都必须通过对 CoUninitialize 的相应调用来平衡。
在调用 除 CoGetMalloc 之外的任何库函数之前,需要在线程上初始化 COM 库,以获取指向标准分配器和内存分配函数的指针。
否则,COM 函数将返回CO_E_NOTINITIALIZED。
设置线程的并发模型后,无法更改该模型。 在以前初始化为多线程的单元上调用 CoInitialize 将失败并返回RPC_E_CHANGED_MODE。
在单线程单元中创建的对象 (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 专业版 [桌面应用 |UWP 应用] |
最低受支持的服务器 | Windows 2000 Server [桌面应用 |UWP 应用] |
目标平台 | Windows |
标头 | combaseapi.h (包括 Objbase.h) |
Library | Ole32.lib |
DLL | Ole32.dll |