實作和啟用沒有額外伺服器數據的處理程式

若要建立處理程序的實例,如果是沒有取得額外伺服器數據的實例,伺服器必須實作 IStdMarshalInfo,但不能作 IMarshal IStdMarshalInfo 有一種方法 GetClassForHandler,它會擷取要用於目的地進程之對象處理程式的 CLSID。 COM 會在為您呼叫 CoMarshalInterface 時呼叫這個 ,並在用戶端啟動處理程式時呼叫這個 。

接下來,伺服器和處理程序實作都必須呼叫 CoGetStdMarshalEx 函式。 此函式會在每一端建立標準封送處理器(在用戶端上稱為 Proxy 管理員,並在伺服器端建立存根管理員)。

伺服器會呼叫 CoGetStdMarshalEx,傳入旗標SMEXF_SERVER。 這會建立伺服器端標準封送處理器(存根管理員)。 下圖顯示伺服器端結構:

Diagram that shows the server-side structure.

伺服器端結構

處理程式會呼叫 CoGetStdMarshalEx,並傳入旗標SMEXF_HANDLER。 這會建立用戶端標準封送處理器(Proxy 管理員),並將它與用戶端上的處理程序匯總。 這兩者的存留期是由控制識別物件(實作 IUnknown)管理,當處理程式呼叫 CoGetStdMarshalEx 時,系統會實作該物件。 下圖顯示客戶端結構。

DIagram that shows the client-side structure.

客戶端結構

如上圖所示,處理程序實際上會夾在 Proxy 管理員與身分識別/控制未知之間。 這可讓系統控制 物件的存留期,同時提供對公開介面的處理程式控制件。 Identity 與 Proxy Manager 之間的虛線表示兩者會透過內部私人介面共用緊密整合。

當 COM 呼叫 用戶端的 CoUnmarshalInterface 時,它會建立處理程式實例,並將它與身分識別匯總。 處理程式會建立標準封送處理器(透過對 CoGetStdMarshalEx呼叫,傳入建立時收到的控制未知。 處理程式不會實作 IMarshal,但只會從標準封送處理器傳回 IMarshal 即使處理程式確實實 作 IMarshal,也不會在 unmarshal 期間呼叫它。

如果兩個線程第一次取消分割相同的物件,則兩個處理程式可能會暫時建立。 之後,將會釋放一個。

輕量型客戶端處理程式