Partager via


Fonctions globales de marshaling

Ces fonctions prennent en charge le marshaling et la conversion de données de marshaling en pointeurs d’interface.

Important

Les fonctions répertoriées dans le tableau suivant ne peuvent pas être utilisées dans les applications qui s’exécutent dans Windows Runtime.

Nom Description
AtlFreeMarshalStream Libère les données de marshal et le IStream pointeur.
AtlMarshalPtrInProc Crée un objet de flux et marshale le pointeur d’interface spécifié.
AtlUnmarshalPtr Convertit les données de marshaling d’un flux en pointeur d’interface.

Conditions requises :

En-tête : atlbase.h

AtlFreeMarshalStream

Libère les données de marshaling dans le flux, puis libère le pointeur de flux.

HRESULT AtlFreeMarshalStream(IStream* pStream);

Paramètres

pStream
[in] Pointeur vers l’interface IStream sur le flux utilisé pour le marshaling.

Exemple

Consultez l’exemple d’AtlMarshalPtrInProc.

AtlMarshalPtrInProc

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

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

Paramètres

punk
[in] Pointeur vers l’interface à marshaler.

iid
[in] GUID de l’interface marshalée.

ppStream
[out] Pointeur vers l’interface IStream sur le nouvel objet de flux utilisé pour le marshaling.

Valeur de retour

Valeur HRESULT standard.

Notes

L’indicateur MSHLFLAGS_TABLESTRONG est défini afin que le pointeur puisse être marshalé sur plusieurs flux. Le pointeur peut également être démarshalé plusieurs fois.

Si le marshaling échoue, le pointeur de flux est libéré.

AtlMarshalPtrInProc ne 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;
}

AtlUnmarshalPtr

Convertit les données de marshaling du flux en un pointeur d'interface qui peut être utilisé par le client.

HRESULT AtlUnmarshalPtr(
    IStream* pStream,
    const IID& iid,
    IUnknown** ppUnk);

Paramètres

pStream
[in] Pointeur vers le flux non délimité.

iid
[in] GUID de l’interface non délimitée.

ppUnk
[out] Pointeur vers l’interface non délimitée.

Valeur de retour

Valeur HRESULT standard.

Exemple

Consultez l’exemple d’AtlMarshalPtrInProc.

Voir aussi

Fonctions