初始化COM
库以供调用线程使用,设置线程的并发模型,并为线程创建一个新公寓(如果需要)。 如果要使用Windows运行时API,或者要使用COM和Windows运行时组件,则应调用Windows::Foundation::Initialize
初始化线程而不是CoInitializeEx
。 Windows::Foundation ::Initialize
足以用于COM组件。
参数
pvReserved [in,optional]此参数保留,必须为NULL。
dwCoInit [in]线程的并发模型和初始化选项。 此参数的值取自COINIT
枚举。 可以使用来自COINIT
的值的任何组合,但不能同时设置COINIT_APARTMENTTHREADED
和COINIT_MULTITHREADED
标志。 默认值为COINIT_MULTITHREADED
。
返回值
此函数可返回标准返回值E_INVALIDARG
,E_OUTOFMEMORY
和E_UNEXPECTED
,以及以下值。
Return code | Description |
---|---|
S_OK | COM库已在此线程上成功初始化。 |
S_FALSE | COM库已在此线程上初始化。 |
RPC_E_CHANGED_MODE | 先前对CoInitializeEx的调用将此线程的并发模型指定为多线程公寓(MTA)。 这也可以表明从中线螺纹公寓到单线螺纹公寓已经发生了变化。 |
备注
CoInitializeEx
必须至少调用一次,对于使用COM
库的每个线程,它通常只调用一次。允许由同一线程对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
。
Requirements
Minimum supported client | Windows 2000 PRofessional[desktop apps or Windows Store apps] |
---|---|
Minimum supported server | Windows 2000 Server [desktop apps |
Minimum supported phone | Windows Phone 8 |
Header | Objbase.h |
Library | Ole32.lib |
DLL | Ole32.dll |
参数
pSecDesc [in,optional]服务器将用于接收呼叫的访问权限。 只有当服务器调用CoInitializeSecurity
时,COM
才使用此参数。 它的值是一个指向三种类型之一的指针:一个AppID
,一个IaccessControl
对象或一个SECURITY_DESCRIPTOR
,以绝对格式。
asAuthSvc
参数中的条目计数。 只有当服务器调用CoInitializeSecurity
时,COM
才使用此参数。 如果此参数为0,则不会注册认证服务,并且服务器无法接收安全呼叫。 值-1指示COM
选择要注册的认证服务,如果是这种情况,则asAuthSvc
参数必须为NULL。 但是,如果此参数为-1,则Schannel
将永远不会被服务器选为认证服务。
服务器愿意用于接收呼叫的身份验证服务数组。 只有当服务器调用CoInitializeSecurity
时,COM
才使用此参数。 有关详细信息,请参阅SOLE_AUTHENTICATION_SERVICE
。
此参数保留,必须为NULL
。
进程的默认身份验证级别。服务器和客户端在调用CoInitializeSecurity
时都使用此参数。 COM
将失败以较低认证级别到达的呼叫。默认情况下,所有代理将至少使用此身份验证级别。此值应包含一个认证级别常量。默认情况下,所有对IUnknown
的调用都是在此级别进行的。
代理的默认模拟级别。此参数的值仅在进程是客户端时使用。它应该是来自模拟级别常量的值,RPC_C_IMP_LEVEL_DEFAULT
除外,不能与CoInitializeSecurity
一起使用。
来自客户端的拨出呼叫始终使用指定的模拟级别。 (不是协商的。)对客户端的来电可以是任何模拟级别。默认情况下,所有IUnknown
调用都使用此模拟级别,因此即使安全感知应用程序也应仔细设置此级别。要确定每个认证服务支持的模拟级别,请参阅COM
和安全软件包中的认证服务的描述。有关模拟级别的详细信息,请参阅模拟。
指向SOLE_AUTHENTICATION_LIST
的指针,它是一个SOLE_AUTHENTICATION_INFO
结构的数组。此列表指示客户机可用于调用服务器的每个认证服务的信息。只有当客户端调用CoInitializeSecurity
时,COM
才使用此参数。
通过设置一个或多个EOLE_AUTHENTICATION_CAPABILITIES
值指定的客户端或服务器的其他功能。其中某些值不能同时使用,有些不能在使用特定认证服务时设置。有关这些标志的更多信息,请参阅备注部分。
此参数保留,必须为NULL。
返回值
此函数可以返回标准返回值E_INVALIDARG
以及以下值。
Return code | Description |
---|---|
S_OK | 表示成功。 |
RPC_E_TOO_LATE | CoInitializeSecurity已被调用。 |
RPC_E_NO_GOOD_SECURITY_PACKAGES | asAuthSvc参数不为NULL,并且列表中的所有身份验证服务都不能注册。 检查保存在asAuthSvc中的结果以获取身份验证服务特定的错误代码。 |
E_OUT_OF_MEMORY | 内存不足。 |
备注
CoInitializeSecurity
函数初始化安全层,并将指定的值设置为安全性默认值。如果进程不调用CoInitializeSecurity
,则COM
在第一次编组或解组接口时自动调用它,注册系统默认安全性。之前没有注册默认安全软件包。
这个函数每个进程只被调用一次,无论是显式还是隐式。它可以由客户端,服务器或两者调用。对于没有显式调用CoInitializeSecurity
的传统应用程序和其他应用程序,COM
使用注册表中的值隐式调用此函数。如果使用注册表设置过程范围安全性,然后调用CoInitializeSecurity
,那么将忽略AppID
注册表值,并使用CoInitializeSecurity
值。
CoInitializeSecurity
可用于覆盖计算机范围的访问权限和特定于应用程序的访问权限,但不能覆盖计算机范围的限制策略。 如果pSecDesc
指向AppID
,则必须在dwCapabilities
中设置EOAC_APPID
标志,并且当设置EOAC_APPID
标志时,将忽略CoInitializeSecurity
的所有其他参数。
CoInitializeSecurity
在注册表中的AppID
键下查找认证级别,并使用它来确定默认安全性。有关如何使用AppID
密钥设置安全性的更多信息,请参阅通过注册表设置流程范围的安全性。 如果pSecDesc
是指向IAccessControl
对象的指针,则必须设置EOAC_ACCESS_CONTROL
标志,并且dwAuthnLevel
不能为none
。 IAccessControl
对象用于确定谁可以调用进程。 DCOM
将AddRef IAccessControl
,并将在调用CoUninitialize
时释放它。不应更改IAccessControl
对象的状态。
如果pSecDesc
是指向SECURITY_DESCRIPTOR
的指针,则在dwCapabilities
中不能设置EOAC_APPID
和EOAC_ACCESS_CONTROL
标志。必须设置SECURITY_DESCRIPTOR
的所有者和组,直到DCOM
支持审核,系统ACL
必须为NULL
。 SECURITY_DESCRIPTOR
的自由ACL
(DACL
)中的访问控制条目(ACE
)用于查找允许哪些调用者连接到进程的对象。没有ACE
的DACL
不允许访问,而NULL DACL
将允许任何人的调用。有关ACL
和ACE
的更多信息,请参阅访问控制模型。应用程序应调用AccessCheck
(而不是IsValidSecurityDescriptor
),以确保在调用CoInitializeSecurity
之前正确形成其SECURITY_DESCRIPTOR
。
强烈建议不要将pSecDesc
传递为NULL
。一个适当的替代方法是使用允许Everyone
的SECURITY_DESCRIPTOR
。如果pSecDesc
为NULL
,dwCapabilities
中的标志确定CoInitializeSecurity
如何定义服务器将使用的访问权限,如下所示:
EOAC_APPID
标志,CoInitializeSecurity
将在注册表中查找应用程序的.exe名称,并使用存储在那里的AppID
。如果设置了EOAC_ACCESS_CONTROL
标志,CoInitializeSecurity
将返回错误。如果既没有设置EOAC_APPID
标志也没有设置EOAC_ACCESS_CONTROL
标志,CoInitializeSecurity
允许所有呼叫者,包括本地和远程匿名用户。如果在dwCapabilities
中设置了EOAC_APPID
和EOAC_ACCESS_CONTROL
标志,则CoInitializeSecurity
函数返回错误。
函数库文件同上。
新闻热点
疑难解答