Compartir a través de


Funciones globales de serialización

Estas funciones proporcionan compatibilidad con la serialización y la conversión de datos de serialización en punteros de interfaz.

Importante

Las funciones enumeradas en la tabla siguiente no se pueden usar en las aplicaciones que se ejecutan en Windows Runtime.

Nombre Descripción
AtlFreeMarshalStream Libera los datos de serialización y el puntero IStream.
AtlMarshalPtrInProc Crea un nuevo objeto de secuencia y serializa el puntero de interfaz especificado.
AtlUnmarshalPtr Convierte los datos de serialización de una secuencia en un puntero de interfaz.

Requisitos:

Encabezado: atlbase.h

AtlFreeMarshalStream

Libera los datos de serializar del flujo; a continuación, libera el puntero del flujo.

HRESULT AtlFreeMarshalStream(IStream* pStream);

Parámetros

pStream
[in] Puntero a la interfaz IStream de la secuencia utilizada para la serialización.

Ejemplo

Consulte el ejemplo de AtlMarshalPtrInProc.

AtlMarshalPtrInProc

Crea un nuevo objeto de flujo, escribe el CLSID del proxy en el flujo y calcula las referencias del puntero de interfaz especificado escribiendo los datos necesarios para inicializar el proxy en el flujo.

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

Parámetros

pUnk
[in] Puntero a la interfaz que se va a serializar.

iid
[in] GUID de la interfaz que se va a serializar.

ppStream
[out] Puntero a la interfaz IStream del nuevo objeto de secuencia usado para la serialización.

Valor devuelto

Valor HRESULT estándar.

Comentarios

La marca MSHLFLAGS_TABLESTRONG se establece para que el puntero se pueda serializar en varias secuencias. El puntero también se puede deserializar varias veces.

Si se produce un error en la serialización, se libera el puntero de la secuencia.

AtlMarshalPtrInProc solo se puede usar en un puntero a un objeto en proceso.

Ejemplo

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

Convierte los datos de cálculo de referencias del flujo en un puntero de interfaz que puede usarse en el cliente.

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

Parámetros

pStream
[in] Puntero a la secuencia que se va a deserializar.

iid
[in] GUID de la interfaz que se va a deserializar.

ppUnk
[out] Puntero a la interfaz deserializada.

Valor devuelto

Valor HRESULT estándar.

Ejemplo

Consulte el ejemplo de AtlMarshalPtrInProc.

Consulte también

Funciones