共用方式為


IMarshal::MarshalInterface 方法 (objidl.h)

封送處理介面指標。

語法

HRESULT MarshalInterface(
  [in] IStream *pStm,
  [in] REFIID  riid,
  [in] void    *pv,
  [in] DWORD   dwDestContext,
  [in] void    *pvDestContext,
  [in] DWORD   mshlflags
);

參數

[in] pStm

要用於封送處理期間之資料流程的指標。

[in] riid

要封送處理之介面識別碼的參考。 此介面必須衍生自 IUnknown 介面。

[in] pv

要封送處理之介面指標的指標。 如果呼叫端沒有所需介面的指標,這個參數可以是 Null

[in] dwDestContext

指定介面的目的地內容,其為未隔離。 dwDestCoNtext的可能值來自列舉MSHCTX。 目前,取消封存可能會發生在目前進程 (MSHCTX_INPROC) 的另一個 Apartment 中,或發生在與目前進程相同的電腦上另一個進程 (MSHCTX_LOCAL) 。

[in] pvDestContext

此參數是保留的,而且必須是 0。

[in] mshlflags

指出要封送處理的資料是要傳輸回用戶端進程,也就是一般案例,還是寫入全域資料表,以便由多個用戶端擷取。 可能的值為來自 MSHLFLAGS 列舉。

傳回值

這個方法可以傳回標準傳回值E_FAIL,以及下列值。

傳回碼 描述
S_OK
介面指標已成功封送處理。
E_NOINTERFACE
不支援指定的介面。
STG_E_MEDIUMFULL
資料流程已滿。

備註

呼叫 CoMarshalInterface時,會間接呼叫這個方法,由伺服器進程中的任何程式碼負責封送處理物件上介面的指標。 這個封送處理常式代碼通常是 COM 為數個介面之一產生的存根,這些介面可以封送處理在完全不同物件上實作之介面的指標。 範例包括 IClassFactoryIOleItemContainer 介面。 為了討論的目的,負責封送處理指標的程式碼稱為 封送處理存根

來電者的附注

一般而言,您的封送處理存根通常不會直接呼叫 MarshalInterface ,而是應該呼叫 CoMarshalInterface 函式,其中包含此方法的呼叫。 存根會呼叫 命令 物件,將其封送處理資料寫入資料流程。 接著,存根會將封送處理資料傳遞回用戶端進程,或將它寫入全域資料表,讓多個用戶端可以取消封送處理。 存根對 CoMarshalInterface 的呼叫通常會在 呼叫 CoGetMarshalSizeMax 之前,以取得將寫入封送處理資料的資料流程緩衝區大小上限。

如果您要實作現有的 COM 介面,或使用 MICROSOFT 介面定義語言 (MIDL) 來定義自己的介面,則不會明確呼叫此方法。 不論是哪一種情況,MIDL 產生的存根都會自動進行呼叫。

如果您未使用 MIDL 來定義自己的介面,封送處理存根必須直接或間接呼叫此方法。 您的存根實作應該在先前呼叫IMarshal::GetMarshalSizeMax傳回之後立即呼叫MarshalInterface。 由於 GetMarshalSizeMax 所傳回的值只有在封送處理之物件的內部狀態未變更時才會有效,因此呼叫 MarshalInterface 的延遲會執行物件需要比原本指示更大的資料流程緩衝區風險。

如果呼叫端具有要封送處理之介面的指標,則應該以效率方式使用 pv 參數傳遞該指標。 如此一來,可能會使用這類指標來判斷 Proxy 的適當 CLSID 的實作不需要自行呼叫 QueryInterface 。 如果呼叫端沒有要封送處理之介面的指標,它可以傳遞 Null

實作者的注意事項

MarshalInterface的實作必須寫入資料流程,才能初始化接收端的 Proxy 所需的任何資料。 這類資料會包含要封送處理之介面的參考、 MSHLFLAGS 值,指定資料是否應該傳回至用戶端進程或寫入全域資料表,以及連接到物件所需的任何專案,例如具名管道、視窗控制碼或 RPC 通道的指標。

您的實作不應該假設資料流程夠大,足以保存所有資料。 相反地,它應該正常處理STG_E_MEDIUMFULL錯誤。 在結束之前,您的實作應該會在寫入最後一個位元組的資料之後,將搜尋指標放在資料流程中。

如果 pv 參數是 Null ,而且您的實作需要介面指標,它可以在目前物件上呼叫 QueryInterface 來取得它。 pv參數只是為了提升效率而存在。

若要確保您的 MarshalInterface 實作會繼續正常運作,因為未來支援新的目的地內容,請將封送處理委派給您實作未處理之所有 dwDestCoNtext 值的 COM 預設實作。 若要將封送處理委派給 COM 預設實作,請呼叫 CoGetStandardMarshal 協助程式函式。

使用 MSHLFLAGS 列舉,呼叫端可以指定介面指標是否要封送處理回單一用戶端或寫入全域資料表,其中可由多個用戶端取消封存。 您必須確定物件可以處理從多個可能從相同初始化資料建立的 Proxy 呼叫。

需求

   
最低支援的用戶端 Windows 2000 專業版 [傳統型應用程式 |UWP 應用程式]
最低支援的伺服器 Windows 2000 Server [傳統型應用程式 |UWP 應用程式]
目標平台 Windows
標頭 objidl.h (包含 ObjIdl.h)

另請參閱

CoMarshalInterface

IMarshal