初始化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函數返回錯誤。
函數庫文件同上。
新聞熱點
疑難解答