COM 類別物件和 CLSID
COM 伺服器會實作為 COM 類別。 COM 類別是每當您與指定物件互動時所執行程式代碼中的介面群組實作。 C++ 類別與 COM 類別之間有重要的區別:在 C++ 中,類別是類型,而 COM 類別只是對象的定義,而且沒有類型,不過 C++ 程式設計人員可能會使用 C++ 類別來實作它。 COM 的設計目的是允許不同應用程式使用類別,包括撰寫的應用程式,而不知道該特定類別的存在。 因此,指定物件類型的類別代碼存在於動態連結庫 (DLL) 或另一個可執行的應用程式 (EXE) 中。
每個 COM 類別都是由 CLSID 識別,這是伺服器必須註冊的唯一 128 位 GUID。 COM 會在用戶端的要求下使用此 CLSID,將特定數據與包含實作 類別的程式代碼的 DLL 或 EXE 產生關聯,從而建立 對象的實例。
對於同一部電腦上的用戶端和伺服器,伺服器的 CLSID 是所有用戶端所需的。 在每部計算機上,COM 都會維護一個資料庫(它會在 Microsoft Windows 和 Macintosh 平臺上使用系統登錄),所有安裝在系統上之伺服器的 CLSID。 這是每個 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 提供數個協助程式函式,可減少建立物件實例的工作。 這些描述於 實例建立協助程式函式中。
相關主題