CoInitialize 函数 (objbase.h)
初始化当前线程上的 COM 库,并将并发模型标识为单线程单元 (STA) 。
新应用程序应调用 CoInitializeEx ,而不是 CoInitialize。
如果要使用Windows 运行时,则必须改为调用 RoInitialize 或 Windows::Foundation::Initialize。
语法
HRESULT CoInitialize(
[in, optional] LPVOID pvReserved
);
parameters
[in, optional] pvReserved
此参数是保留的,必须为 NULL。
返回值
此函数可以返回标准返回值E_INVALIDARG、E_OUTOFMEMORY和E_UNEXPECTED,以及以下值。
返回代码 | 说明 |
---|---|
|
COM 库在此线程上已成功初始化。 |
|
COM 库已在此线程上初始化。 |
|
先前对 CoInitializeEx 的调用将此线程的并发模型指定为多线程单元 (MTA) 。 这也可能表明发生了从中性线程单元到单线程单元的更改。 |
注解
在调用 除 CoGetMalloc 之外的任何库函数之前,需要在线程上初始化 COM 库,以获取指向标准分配器和内存分配函数的指针。
设置线程的并发模型后,无法更改该模型。 在以前初始化为多线程的公寓上调用 CoInitialize 将失败并返回RPC_E_CHANGED_MODE。
CoInitializeEx 提供与 CoInitialize 相同的功能,并且还提供了一个参数来显式指定线程的并发模型。 CoInitialize 调用 CoInitializeEx ,并将并发模型指定为单线程单元。 今天开发的应用程序应调用 CoInitializeEx ,而不是 CoInitialize。
通常,COM 库仅在线程上初始化一次。 在同一线程上对 CoInitialize 或 CoInitializeEx 的后续调用将成功,只要它们不尝试更改并发模型,但会返回S_FALSE。 若要正常关闭 COM 库,每次成功调用 CoInitialize 或 CoInitializeEx(包括返回S_FALSE)都必须通过对 CoUninitialize 的相应调用来平衡。 但是,应用程序中使用 0 (调用 CoInitialize 或使用 COINIT_APARTMENTTHREADED) 调用 CoInitializeEx 的第一个线程必须是调用 CoUninitialize 的最后一个线程。 否则,对 STA 上的 CoInitialize 的后续调用将失败,应用程序将不起作用。
由于无法控制加载或卸载进程内服务器的顺序,因此请不要从 DllMain 函数调用 CoInitialize、CoInitializeEx 或 CoUninitialize。
要求
最低受支持的客户端 | 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 () |