CoGetClassObject 函式 (combaseapi.h)

提供與指定 CLSID 相關聯之類別物件上介面的指標。 CoGetClassObject 會找出並視需要動態載入執行此動作所需的可執行程式碼。

直接呼叫 CoGetClassObject ,透過系統登錄中有 CLSID 的類別物件建立多個物件。 您也可以從特定的遠端電腦擷取類別物件。 大部分的類別物件都會實作 IClassFactory 介面。 然後,您會呼叫 CreateInstance 來建立未初始化的物件。 不過,不一定需要進行此程式。 若要建立單一物件,請呼叫 CoCreateInstanceEx 函式,這可讓您在遠端電腦上建立實例。 這會取代 CoCreateInstance 函式,這仍可用來在本機電腦上建立實例。 這兩個函式都會封裝連接到類別物件、建立實例,以及釋放類別物件。 其他兩個 函式 CoGetInstanceFromFileCoGetInstanceFromIStorage會在遠端系統和物件啟用上提供兩個實例建立。 有許多函式和介面方法,其用途是建立單一類型的物件,並提供該物件上介面的指標。

語法

HRESULT CoGetClassObject(
  [in]           REFCLSID rclsid,
  [in]           DWORD    dwClsContext,
  [in, optional] LPVOID   pvReserved,
  [in]           REFIID   riid,
  [out]          LPVOID   *ppv
);

參數

[in] rclsid

與您將用來建立物件的資料和程式碼相關聯的 CLSID。

[in] dwClsContext

執行可執行程式碼的內容。 若要啟用遠端啟用,請包含CLSCTX_REMOTE_SERVER。 如需內容值及其使用的詳細資訊,請參閱 CLSCTX 列舉。

[in, optional] pvReserved

要具現化類別物件的電腦指標。 如果此參數為Null,類別物件會根據dwClsCtx參數的解譯,在目前電腦上或類別的 RemoteServerName索引鍵下指定的電腦上具現化。 請參閱 COSERVERINFO

[in] riid

介面識別碼的參考,此識別碼將在成功傳回時于 ppv 中提供。 這個介面將用來與類別物件通訊。 這個值通常是IID_IClassFactory,但允許支援授權形式的其他值,例如IID_IClassFactory2。 所有 OLE 定義的介面 IID 都會在 OLE 標頭檔中定義為 IID_interfacename,其中 interfacename 是介面的名稱。

[out] ppv

接收 riid中要求的介面指標的指標變數位址。 成功傳回時,*ppv 包含要求的介面指標。

傳回值

此函式可以傳回下列值。

傳回碼 描述
S_OK
指定類別物件的位置和連線成功。
REGDB_E_CLASSNOTREG
CLSID 未正確註冊。 此錯誤也可以指出您在 dwClsCoNtext 中指定的值不在登錄中。
E_NOINTERFACE
ppv所指向的物件不支援riid所識別的介面,或傳回之類別物件上的QueryInterface作業E_NOINTERFACE。
REGDB_E_READREGDB
讀取註冊資料庫時發生錯誤。
CO_E_DLLNOTFOUND
根據內容) ,找不到進程內 DLL 或處理常式 DLL (。
CO_E_APPNOTFOUND
找不到可執行檔 (.exe) , (CLSCTX_LOCAL_SERVER) 。
E_ACCESSDENIED
載入時發生一般存取失敗。
CO_E_ERRORINDLL
可執行檔映射中發生錯誤。
CO_E_APPDIDNTREG
可執行檔已啟動,但未註冊類別物件 (,而且可能已關閉) 。

備註

OLE 中的類別物件是中繼物件,可支援允許物件群組通用作業的介面。 此群組中的物件是衍生自單一 CLSID 所代表之相同物件定義的實例。 通常,在類別物件上實作的介面是 IClassFactory,您可以透過此介面建立指定定義 (類別的物件實例) 。

對 CoGetClassObject的呼叫會建立、初始化,並透過使用 riid參數指定之介面的指標,對類別物件) ,讓呼叫端存取 (。 類別物件與您在 rclsid 參數中指定的 CLSID 相關聯。 系統如何找出電腦內相關聯程式碼和資料的詳細資料對呼叫端而言是透明的,如同尚未載入的任何程式碼動態載入。

如果類別內容CLSCTX_REMOTE_SERVER,表示需要遠端啟用,pServerInfo 參數中提供的 COSERVERINFO結構可讓您指定伺服器所在的電腦。 如需在 pServerInfoNull時用來尋找遠端伺服器的演算法資訊,請參閱 CLSCTX 列舉。

有兩個位置可尋找類別的 CLSID:

  • 登錄會保存 CLSID 與檔案尾碼之間的關聯,以及 CLSID 與檔案簽章之間的關聯,以判斷物件的類別。
  • 當物件儲存至永續性儲存體時,其 CLSID 會與其資料一起儲存。
若要建立和初始化內嵌或連結的 OLE 檔物件,不需要直接呼叫 CoGetClassObject 。 請改為呼叫 OleCreateOleCreateXXX 函式。 這些函式會封裝整個物件具現化和初始化程式,並在其他函式 中呼叫 CoGetClassObject

riid參數會指定用戶端將用來與類別物件通訊的介面。 在大部分情況下,此介面為 IClassFactory。 這會提供 CreateInstance 方法的存取權,讓呼叫端接著可以建立在其實作中指定的類型未初始化物件。 使用 CLSID 在系統中註冊的所有類別都必須實作 IClassFactory

不過,在罕見的情況下,您可能想要指定一些定義一組物件通用作業的其他介面。 例如,在 OLE 實作 Monikers 的方式中,類別物件的介面是 IParseDisplayName,用來將物件的顯示名稱轉換成 Moniker。

dwClsCoNtext參數會指定執行內容,允許一個 CLSID 與不同執行內容中的不同程式碼片段相關聯。 CLSCTX列舉會指定可用的內容旗標。 CoGetClassObject 會針對) 登錄和目前透過呼叫 CoRegisterClassObject 函式來註冊的內容,查閱 (。

若要釋放類別物件,請使用類別物件的 Release 方法。 CoRevokeClassObject函式僅用於從系統登錄中移除類別物件的 CLSID。

規格需求

   
最低支援的用戶端 Windows 2000 專業版 [僅限傳統型應用程式]
最低支援的伺服器 Windows 2000 Server [僅限傳統型應用程式]
目標平台 Windows
標頭 combaseapi.h (包含 Objbase.h)
程式庫 Ole32.lib
Dll Ole32.dll

另請參閱

CLSCTX

COSERVERINFO

CoCreateInstanceEx

CoRegisterClassObject

CoRevokeClassObject

透過類別物件建立物件

OleCreate

OleLoad