CoInitialize 函数 (objbase.h)

初始化当前线程上的 COM 库,并将并发模型标识为单线程单元 (STA) 。

新应用程序应调用 CoInitializeEx ,而不是 CoInitialize。

如果要使用Windows 运行时,则必须改为调用 RoInitializeWindows::Foundation::Initialize

语法

HRESULT CoInitialize(
  [in, optional] LPVOID pvReserved
);

parameters

[in, optional] pvReserved

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

返回值

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

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

注解

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

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

CoInitializeEx 提供与 CoInitialize 相同的功能,并且还提供了一个参数来显式指定线程的并发模型。 CoInitialize 调用 CoInitializeEx ,并将并发模型指定为单线程单元。 今天开发的应用程序应调用 CoInitializeEx ,而不是 CoInitialize

通常,COM 库仅在线程上初始化一次。 在同一线程上对 CoInitializeCoInitializeEx 的后续调用将成功,只要它们不尝试更改并发模型,但会返回S_FALSE。 若要正常关闭 COM 库,每次成功调用 CoInitializeCoInitializeEx(包括返回S_FALSE)都必须通过对 CoUninitialize 的相应调用来平衡。 但是,应用程序中使用 0 (调用 CoInitialize 或使用 COINIT_APARTMENTTHREADED) 调用 CoInitializeEx 的第一个线程必须是调用 CoUninitialize 的最后一个线程。 否则,对 STA 上的 CoInitialize 的后续调用将失败,应用程序将不起作用。

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

要求

   
最低受支持的客户端 Windows 2000 Professional [仅限桌面应用]
最低受支持的服务器 Windows 2000 Server [仅限桌面应用]
目标平台 Windows
标头 objbase.h
Library Ole32.lib
DLL Ole32.dll
API 集 在 Windows 10 版本 10.0.20166 中引入的 ext-ms-win-com-sta-l1-1-0 ()

请参阅

CoInitializeEx