マーシャリングに関するグローバル関数
これらの関数は、マーシャリング データのマーシャリングとインターフェイス ポインターへの変換をサポートします。
重要
次の表に示す関数は、Windows ランタイムで実行されるアプリケーションでは使用できません。
名前 | 説明 |
---|---|
AtlFreeMarshalStream | マーシャリング データと IStream ポインターを解放します。 |
AtlMarshalPtrInProc | 新しいストリーム オブジェクトを作成し、指定したインターフェイス ポインターをマーシャリングします。 |
AtlUnmarshalPtr | ストリームのマーシャリング データをインターフェイス ポインターに変換します。 |
要件:
ヘッダー: atlbase.h
AtlFreeMarshalStream
ストリーム内のマーシャリング データを解放し、次にストリーム ポインターも解放します。
HRESULT AtlFreeMarshalStream(IStream* pStream);
パラメーター
pStream
[入力] マーシャリングに使用されるストリーム上にある IStream
インターフェイスへのポインター。
例
AtlMarshalPtrInProc の例を参照してください。
AtlMarshalPtrInProc
新しいストリーム オブジェクトを作成し、プロキシの CLSID をストリームに書き込みます。さらに、プロキシの初期化に必要なデータをストリームに書き込んで、指定されたインターフェイス ポインターをマーシャリングします。
HRESULT AtlMarshalPtrInProc(
IUnknown* pUnk,
const IID& iid,
IStream** ppStream);
パラメーター
pUnk
[入力] マーシャリング対象のインターフェイスへのポインター。
iid
[入力] マーシャリング中のインターフェイスの GUID。
ppStream
[出力] マーシャリングに使用される新しいストリーム オブジェクト上にある IStream
インターフェイスへのポインター。
戻り値
標準の HRESULT 値。
解説
ポインターを複数のストリームにマーシャリングできるように、MSHLFLAGS_TABLESTRONG が設定されます。 また、ポインターのマーシャリングは、複数回解除することができます。
ストリーム ポインターは、マーシャリングが失敗すると解放されます。
AtlMarshalPtrInProc
は、インプロセス オブジェクトへのポインターにのみ使用することができます。
例
//marshaling interface from one thread to another
//IStream ptr to hold serialized presentation of interface ptr
IStream* g_pStm;
//forward declaration
DWORD WINAPI ThreadProc(LPVOID lpParameter);
HRESULT WriteInterfacePtrToStream(IMyCircle *pCirc)
{
//marshal the interface ptr to another thread
//pCirc has to be pointer to actual object & not a proxy
HRESULT hr = AtlMarshalPtrInProc(pCirc, IID_IMyCircle, &g_pStm);
//m_dwThreadID is a DWORD holding thread ID of thread being created.
CreateThread(NULL, 0, ThreadProc, NULL, 0, &m_dwThreadID);
return hr;
}
DWORD WINAPI ThreadProc(LPVOID /*lpParameter*/)
{
// CoInitializeEx is per thread, so initialize COM on this thread
// (required by AtlUnmarshalPtr)
HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
if (SUCCEEDED(hr))
{
IMyCircle* pCirc;
//unmarshal IMyCircle ptr from the stream
hr = AtlUnmarshalPtr(g_pStm, IID_IMyCircle, (IUnknown**)&pCirc);
// use IMyCircle ptr to call its methods
double center;
pCirc->get_XCenter(¢er);
//release the stream if no other thread requires it
//to unmarshal the IMyCircle interface pointer
hr = AtlFreeMarshalStream(g_pStm);
CoUninitialize();
}
return hr;
}
AtlUnmarshalPtr
ストリームのマーシャリング データをクライアントが使用できるインターフェイス ポインターに変換します。
HRESULT AtlUnmarshalPtr(
IStream* pStream,
const IID& iid,
IUnknown** ppUnk);
パラメーター
pStream
[入力] マーシャリングを解除中のストリームへのポインター。
iid
[入力] マーシャリングを解除中のインターフェイスの GUID。
ppUnk
[出力] マーシャリングが解除されたインターフェイスへのポインター。
戻り値
標準の HRESULT 値。
例
AtlMarshalPtrInProc の例を参照してください。