IMarshal::GetUnmarshalClass 方法 (objidl.h)
擷取未分組程序代碼的 CLSID。
語法
HRESULT GetUnmarshalClass(
[in] REFIID riid,
[in] void *pv,
[in] DWORD dwDestContext,
[in] void *pvDestContext,
[in] DWORD mshlflags,
[out] CLSID *pCid
);
參數
[in] riid
要封送處理之介面標識碼的參考。
[in] pv
要封送處理之介面的指標;如果呼叫端沒有所需介面的指標,則可為 NULL 。
[in] dwDestContext
指定介面的目的地內容,其為未隔離。 可能的值為來自列舉 MSHCTX。 解除封存可能會發生在目前進程的另一個 Apartment 中 (MSHCTX_INPROC) ,或發生在與目前進程相同的電腦上另一個進程 (MSHCTX_LOCAL) 。
[in] pvDestContext
此參數是保留的,而且必須是 NULL。
[in] mshlflags
指出要封送處理的數據是要傳輸回用戶端進程, (一般案例) 或寫入全域數據表,其中可由多個用戶端擷取。 可能的值為來自 MSHLFLAGS 列舉。
[out] pCid
指標,接收用來在用戶端程式中建立 Proxy 的 CLSID。
傳回值
如果方法成功,傳回值會S_OK。 否則,它會S_FALSE。
備註
在 呼叫 CoMarshalInterface 時,會間接呼叫這個方法,由伺服器進程中的任何程式代碼負責封送處理物件上介面的指標。 這個封送處理程式代碼通常是 COM 為數個介面之一產生的存根,這些介面可以封送處理在完全不同對象上實作之介面的指標。 範例包括 IClassFactory 和 IOleItemContainer 介面。 為了討論的目的,負責封送處理指標的程式代碼稱為 封送處理存根。
若要建立物件的 Proxy,COM 需要原始物件的兩項資訊:要寫入封送處理數據流和 Proxy CLSID 的數據量。
封送處理存根會取得這兩項資訊,並連續呼叫 CoGetMarshalSizeMax 和 CoMarshalInterface。
來電者的附註
封送處理存根會呼叫 對象的這個方法實作,以取得用來建立 Proxy 實例的 CLSID。 用戶端在收到 CLSID 時,會在系統登錄中載入針對它列出的 DLL。如果您要實作現有的 COM 介面或使用 Microsoft 介面定義語言 (MIDL) 來定義您自己的介面,則不會明確呼叫此方法。 不論是哪一種情況,存根都會自動進行呼叫。 請參閱 定義 COM 介面。
如果您未使用 MIDL 來定義自己的介面,則存根必須直接或間接呼叫此方法,才能取得用戶端 COM 連結庫需要為實作介面的物件建立 Proxy 的 CLSID。
如果呼叫端具有要封送處理之介面的指標,則應該以效率方式使用 pv 參數傳遞該指標。 如此一來,可能會使用這類指標來判斷 Proxy 的適當 CLSID 的實作不需要自行呼叫 QueryInterface 。 如果呼叫端沒有要封送處理之介面的指標,它可以傳遞 NULL。
實作者的注意事項
COM 會呼叫 GetUnmarshalClass ,以取得用於在用戶端程式中建立 Proxy 的 CLSID。 要用於 Proxy 的 CLSID 通常不是原始物件的 CLSID,但您將使用 proxy 物件的 Guidgen.exe 工具) 產生 (。針對提供一或多個介面封送處理的每個物件實作這個方法。 負責封送處理物件的程式代碼會將CLSID以及封送處理數據寫入數據流;COM 會從接收端的數據流擷取 CLSID 和數據。
如果您的 Proxy 實作只包含將整個原始物件複製到用戶端程式,因此不需要轉送對原始物件的呼叫,則傳回的 CLSID 會與原始物件的呼叫相同。 當然,建議只針對不預期變更的物件,才建議此策略。
如果 pv 參數是 NULL ,而且您的實作需要介面指標,它可以在目前物件上呼叫 QueryInterface 來取得它。 pv 參數只是為了提升效率而存在。
為了確保 您的 GetUnmarshalClass 實作會繼續正常運作,因為未來支援新的目的地內容,請將封送處理委派給您實作未處理之所有 dwDestContext 值的 COM 默認實作。 若要將封送處理委派給 COM 默認實作,請呼叫 CoGetStandardMarshal 函式。
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | Windows 2000 專業版 [傳統型應用程式 |UWP 應用程式] |
最低支援的伺服器 | Windows 2000 Server [傳統型應用程式 |UWP 應用程式] |
目標平台 | Windows |
標頭 | objidl.h |