次の方法で共有


マーシャリングに関するグローバル関数

これらの関数は、マーシャリング データのマーシャリングとインターフェイス ポインターへの変換をサポートします。

重要

次の表に示す関数は、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(&center);

      //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 の例を参照してください。

関連項目

関数