IMarshal::MarshalInterface 方法 (objidlbase.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,以及下列值。
傳回碼 | 描述 |
---|---|
|
介面指標已成功封送處理。 |
|
不支援指定的介面。 |
|
數據流已滿。 |
備註
在 呼叫 CoMarshalInterface 時,會間接呼叫這個方法,由伺服器進程中的任何程式代碼負責封送處理物件上介面的指標。 這個封送處理程式代碼通常是 COM 為數個介面之一產生的存根,這些介面可以封送處理在完全不同對象上實作之介面的指標。 範例包括 IClassFactory 和 IOleItemContainer 介面。 為了討論的目的,負責封送處理指標的程式代碼稱為 封送處理存根。
來電者的附註
一般而言,您的封送處理存根通常不會直接呼叫 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 |
標頭 | objidlbase.h (包含 ObjIdl.h) |