IMarshal::GetMarshalSizeMax 方法 (objidl.h)
擷取封送處理期間所需的緩衝區大小上限。
語法
HRESULT GetMarshalSizeMax(
[in] REFIID riid,
[in] void *pv,
[in] DWORD dwDestContext,
[in] void *pvDestContext,
[in] DWORD mshlflags,
[out] DWORD *pSize
);
參數
[in] riid
要封送處理之介面標識碼的參考。
[in] pv
要封送處理的介面指標。 此參數可以是 Null。
[in] dwDestContext
指定介面要取消封封的目的地內容。 可能的值來自列舉 MSHCTX。 取消封存可能會發生在目前進程的另一個 Apartment (MSHCTX_INPROC) ,或在與目前進程相同的電腦上的另一個進程中發生 (MSHCTX_LOCAL) 。
[in] pvDestContext
此參數是保留的,而且必須是 NULL。
[in] mshlflags
指出要封送處理的數據是要傳輸回用戶端進程, (一般案例) 或寫入全域數據表,其中可由多個用戶端擷取。 可能的值來自 MSHLFLAGS 列舉。
[out] pSize
接收緩衝區大小上限之變數的指標。
傳回值
這個方法可以傳回標準傳回值E_FAIL和S_OK,以及下列值。
傳回碼 | Description |
---|---|
|
不支援指定的介面。 |
備註
此方法會在 呼叫 CoGetMarshalSizeMax 時間接呼叫,由伺服器進程中的任何程式碼負責封送處理物件上介面的指標。 這個封送處理程式代碼通常是 COM 針對數個介面之一所產生的存根,可封送處理完全不同對象上實作之介面的指標。 範例包括 IClassFactory 和 IOleItemContainer 介面。 為了討論,負責封送處理指標的程式代碼稱為 封送處理存根。
若要為物件建立 Proxy,COM 需要來自原始物件的兩項資訊:要寫入封送處理數據流和 Proxy CLSID 的數據量。
封送處理存根會取得這兩段資訊,並連續呼叫 CoGetMarshalSizeMax 和 CoMarshalInterface。
來電者附註
透過呼叫 CoGetMarshalSizeMax,封送處理存根會呼叫對象的這個方法實作,以預先配置將傳遞至 MarshalInterface 的數據流緩衝區。如果您要實作現有的 COM 介面或使用 Microsoft 介面定義語言 (MIDL) 來定義您自己的自定義介面,則不會明確呼叫此方法。 不論是哪一種情況,MIDL 產生的存根都會自動進行呼叫。
如果您未使用 MIDL 來定義自己的介面 (請參閱 定義 COM 介面) ,封送處理存根不需要呼叫 GetMarshalSizeMax,但強烈建議這麼做。 物件比介面存根知道封送處理數據封包的大小上限可能更好。 因此,除非您提供自動成長的數據流,如此一來,擴充它的額外負荷就不重要,即使實作自己的介面,您也應該呼叫此方法。
只要正在封送處理的對象內部狀態不會變更,這個方法所傳回的值才會保證有效。 因此,在傳回此函式之後,應該立即完成實際的封送處理,或存根因為狀態的某些變更而執行對象的風險,可能需要比原本表示更多的記憶體封送處理。
實作者的注意事項
您的 MarshalInterface 實作會使用預先配置的緩衝區,將封送處理數據寫入數據流。 如果緩衝區太小,封送處理作業將會失敗。 因此,這個方法所傳回的值必須是封送處理介面所需數據的保守估計值。 違反此需求應視為重大錯誤。在後續呼叫 MarshalInterface 時, 您的 IMarshal 實作無法依賴呼叫端實際上已事先呼叫 GetMarshalSizeMax 。 它仍然必須謹慎處理數據流所傳回STG_E_MEDIUMFULL錯誤,並準備好正常處理錯誤。
為了確保您的 GetMarshalSizeMax 實作會繼續正常運作,因為未來支援新的目的地內容,請委派封送處理至您實作無法瞭解之所有 dwDestContext 值的 COM 默認實作。 若要委派封送處理至 COM 預設實作,請呼叫 CoGetStandardMarshal 函式。
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | Windows 2000 專業版 [傳統型應用程式 |UWP 應用程式] |
最低支援的伺服器 | Windows 2000 Server [傳統型應用程式 |UWP 應用程式] |
目標平台 | Windows |
標頭 | objidl.h |