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
E_NOINTERFACE
不支援指定的介面。

備註

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

若要為物件建立 Proxy,COM 需要來自原始物件的兩項資訊:要寫入封送處理數據流和 Proxy CLSID 的數據量。

封送處理存根會取得這兩段資訊,並連續呼叫 CoGetMarshalSizeMaxCoMarshalInterface

來電者附註

透過呼叫 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

另請參閱

CoGetMarshalSizeMax

IMarshal