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(¢er);
//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.