Win32 API 日本語リファレンス
ホームSystem.Com.CallObj › ICallUnmarshal

ICallUnmarshal

COM
IID5333b003-2e42-11d2-b89d-00c04fb9618a継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

リモート呼び出しのサーバー(受信)側で使用されます。

メソッド 2

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 3 HRESULT Unmarshal(DWORD iMethod, void* pBuffer, DWORD cbBuffer, BOOL fForceBufferCopy, DWORD dataRep, CALLFRAME_MARSHALCONTEXT* pcontext, DWORD* pcbUnmarshalled, ICallFrame** ppFrame)

マーシャリングされたデータパケットを、その後呼び出したり他の方法で操作したりできるアクティベーションレコードに戻します。

iMethodDWORDinメソッド番号。このパラメーターが -1 の場合、メソッド番号はアンマーシャリング対象のデータから判定されます。
pBuffervoid*inアクティベーションレコードを作成するためのバッファーへのポインター。
cbBufferDWORDinバッファーのサイズ(バイト単位)。
fForceBufferCopyBOOLinバッファーをコピーして保持するか(非ゼロ)、バッファーが有効なまま維持されるか(ゼロ)を示します。
dataRepDWORDinデータがマーシャリングされた際のデータ表現。
pcontextCALLFRAME_MARSHALCONTEXT*inアンマーシャリングを実行するコンテキストに関する情報を含む CALLFRAME_MARSHALCONTEXT 構造体へのポインター。
pcbUnmarshalledDWORD*out正常にアンマーシャリングされたバイト数へのポインター。
ppFrameICallFrame**outアンマーシャリングされた呼び出しにバインドされたコールフレーム。

戻り値

このメソッドは次の値を返すことがあります。

戻り値コード 説明
S_OK
メソッドは正常に完了しました。
E_UNEXPECTED
予期しないエラーが発生しました。
vtbl 4 HRESULT ReleaseMarshalData(DWORD iMethod, void* pBuffer, DWORD cbBuffer, DWORD ibFirstRelease, DWORD dataRep, CALLFRAME_MARSHALCONTEXT* pcontext)

マーシャリングされたデータパケット内に存在するインターフェイスポインターが保持している可能性のあるリソースを解放します。このメソッドはパケット内のすべてのインターフェイスポインターを検出し、各インターフェイスポインターに対して CoReleaseMarshalData 関数を呼び出します。

iMethodDWORDinメソッド番号。
pBuffervoid*inマーシャリングされた出力パラメーターを含むバッファーへのポインター。
cbBufferDWORDinバッファーのサイズ(バイト単位)。
ibFirstReleaseDWORDin解放するバッファー内の最初のバイト。値がゼロの場合、バッファー全体のインターフェイスポインターが解放されることを意味します。指定されたバイトより前のマーシャリングされたインターフェイスポインターは、他の何らかの仕組みによってすでに解放されているものとみなされます。
dataRepDWORDinデータがマーシャリングされた際のデータ表現。
pcontextCALLFRAME_MARSHALCONTEXT*inアンマーシャリングを実行するコンテキストに関する情報を含む CALLFRAME_MARSHALCONTEXT 構造体へのポインター。

戻り値

このメソッドは次の値を返すことがあります。

戻り値コード 説明
S_OK
メソッドは正常に完了しました。
E_UNEXPECTED
予期しないエラーが発生しました。

解説(Remarks)

マーシャリングされたバッファーが保持するリソースをクリーンアップするには、ReleaseMarshalData メソッドを呼び出す必要があります。ただし、MSHLFLAGS 列挙体が normal に設定されている場合、これはアンマーシャリング時に自動的に行われます。

ReleaseMarshalData は、マーシャリングされた入力パラメーターと出力パラメーターの両方に使用できます。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

HSP用 COM定義

#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"

出力引数:
#define global IID_ICallUnmarshal "{5333B003-2E42-11D2-B89D-00C04FB9618A}"
#usecom global ICallUnmarshal IID_ICallUnmarshal "{}"
#comfunc global ICallUnmarshal_Unmarshal           3 int,sptr,int,int,int,var,var,sptr
#comfunc global ICallUnmarshal_ReleaseMarshalData  4 int,sptr,int,int,int,var
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。