COM 類別物件和 CLSID
COM 伺服器會實作為 COM 類別。 COM 類別 是每當您與指定物件互動時,所執行程式代碼中的介面群組實作。 C++類別和 COM 類別之間有一個重要的區別:在 C++ 中,類別是類型,而 COM 類別只是對象的定義,而且沒有任何類型,不過 C++ 程式設計人員可以使用 C++類別來實作它。 COM 的設計目的是允許不同應用程式使用類別,包括撰寫的應用程式,而不知道該特定類別的存在。 因此,指定物件類型的類別代碼存在於動態連結庫 (DLL) 或另一個可執行的應用程式 (EXE) 中。
每個 COM 類別都是由 CLSID識別,這是伺服器必須註冊的唯一 128 位 GUID。 COM 會在用戶端的要求下使用此 CLSID,將特定數據與包含實作 類別的程式代碼的 DLL 或 EXE 產生關聯,從而建立 對象的實例。
對於同一部電腦上的用戶端和伺服器,伺服器的 CLSID 是所有用戶端所需的。 在每部計算機上,COM 都會維護一個資料庫(它會使用安裝在系統上之伺服器的所有 CLSID Microsoft Windows 和 Macintosh 平臺上的系統登錄。 這是每個 CLSID 與 DLL 或 EXE 之間的對應,該 DLL 或 EXE 會裝載該 CLSID 的程式代碼。 每當用戶端想要建立 COM 類別的實例並使用其服務時,COM 就會查閱此資料庫,因此客戶端永遠不需要知道電腦上的程式碼絕對位置。
針對分散式系統,COM 提供登錄專案,允許遠端伺服器自行註冊供用戶端使用。 雖然應用程式只需要知道伺服器的CLSID,因為它們可以依賴登錄來尋找伺服器,COM可讓用戶端覆寫登錄專案並指定伺服器位置,以充分利用網路。 (請參閱 尋找遠端物件。
建立類別實例的基本方法是透過 COM 類別物件。 這隻是一個中繼物件,可支援建立指定類別之新實例的通用函式。 大部分用來從 CLSID 建立物件的類別物件都支援 IClassFactory 介面,這個介面包含重要 CreateInstance 方法。 您可以針對要具現化的每個物件類別,實作 IClassFactory 介面。 (如需實作 IClassFactory的詳細資訊,請參閱 實作 IClassFactory。
注意
支援某些其他自定義類別處理站介面的伺服器不需要特別支援 IClassFactory 。 不過,CoGetClassObject 以外的啟動函式呼叫(例如 CoCreateInstanceEx),要求伺服器支援 IClassFactory 。
當用戶端想要建立伺服器對象的實例時,它會在呼叫 CoGetClassObject中使用所需的物件的 CLSID。 (透過其中一個物件建立協助程式函式,此呼叫可以是直接或隱含的。此函式會找出與 CLSID 相關聯的程式代碼,並建立類別物件,並提供要求的介面指標。 (CoGetClassObject 會採用指定用戶端所需介面指標的 riid 參數。
注意
COM 只有一些函式,其中許多其他函式都是建置的。 其中最重要的部分可能是 CoGetClassObject,這會低估所有實例建立函式。
使用此指標,呼叫端可以建立 對象的實例,並擷取物件上所要求介面的指標。 這通常是初始化介面,用來啟動物件(將其置於執行中狀態),讓用戶端可以對想要的物件執行任何工作。 使用 COM 的基本函式時,用戶端也必須小心釋放所有物件指標。
啟動物件實例的另一個機制是透過類別Moniker。 類別Monikers會系結至為其建立之類別的類別物件。 如需詳細資訊,請參閱 類別Monikers。
COM 提供數個協助程式函式,可減少建立物件實例的工作。 這些描述於 實體建立協助程式函式。
相關主題