Partager via


AtlMarshalPtrInProc

Crée un objet de flux, écrit le CLSID du proxy au flux, et marshale le pointeur d'interface spécifié en écrivant les données nécessaires pour initialiser le proxy dans le flux.

Important

Cette fonction ne peut pas être utilisée dans les applications qui s'exécutent dans Windows Runtime.

HRESULT AtlMarshalPtrInProc( 
IUnknown* pUnk, 
const IID& iid, 
IStream** ppStream  
);

Paramètres

  • pUnk
    [in] Pointeur vers l'interface à marshaler.

  • iid
    [in] GUID de l'interface qui est marshalé.

  • ppStream
    [out] Pointeur vers l'interface d' IStream sur le nouvel objet de flux utilisé pour marshaler.

Valeur de retour

Une valeur HRESULT standard.

Notes

La balise de MSHLFLAGS_TABLESTRONG est définie afin que le pointeur peut être marshalé à plusieurs flux. Le pointeur peut également être démarshalé plusieurs fois.

Si le marshaling de échec, le pointeur sur stream est libéré.

AtlMarshalPtrInProc peut être utilisé que sur un pointeur vers un objet in-process.

Exemple

//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;
}

Configuration requise

Header: atlbase.h

Voir aussi

Référence

AtlUnmarshalPtr

AtlFreeMarshalStream

MSHLFLAGS

Autres ressources

Marshaler des fonctions globales