Compartilhar via


Funções globais de marshaling

Essas funções dão suporte a marshaling e conversão de dados de marshaling em ponteiros de interface.

Importante

As funções listadas na tabela a seguir não podem ser usadas em aplicativos que são executados no Windows Runtime.

Nome Descrição
AtlFreeMarshalStream Libera os dados de marshal e o ponteiro IStream.
AtlMarshalPtrInProc Cria um novo objeto de fluxo e realiza marshaling do ponteiro de interface especificado.
AtlUnmarshalPtr Converte dados de marshaling de um fluxo em um ponteiro de interface.

Requisitos:

Cabeçalho: atlbase.h

AtlFreeMarshalStream

Libera os dados de marshaling no fluxo e depois libera o ponteiro de fluxo.

HRESULT AtlFreeMarshalStream(IStream* pStream);

Parâmetros

pStream
[in] Um ponteiro para a interface IStream no fluxo usado para marshaling.

Exemplo

Confira o exemplo de AtlMarshalPtrInProc.

AtlMarshalPtrInProc

Cria um novo objeto de fluxo, grava o CLSID do proxy no fluxo e realiza o marshaling do ponteiro de interface especificado gravando os dados necessários para inicializar o proxy no fluxo.

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

Parâmetros

pUnk
[in] Um ponteiro para a interface em que o marshaling será realizado.

iid
[in] O GUID da interface em que o marshaling está sendo realizado.

ppStream
[out] Um ponteiro para a interface IStream no novo objeto de fluxo usado para marshaling.

Valor de Devolução

Um valor HRESULT padrão.

Comentários

O sinalizador MSHLFLAGS_TABLESTRONG é definido para que o ponteiro possa ter o marshaling realizado em vários fluxos. O ponteiro também passar por unmarshaling várias vezes.

Se o marshaling falhar, o ponteiro do fluxo será liberado.

AtlMarshalPtrInProc só pode ser usado em um ponteiro para um objeto em processo.

Exemplo

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

Converte os dados de marshaling do fluxo em um ponteiro de interface que pode ser usado pelo cliente.

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

Parâmetros

pStream
[in] Um ponteiro para o fluxo que está passando por unmarshaling.

iid
[in] O GUID da interface em que o unmarshaling está sendo realizado.

ppUnk
[out] Um ponteiro para a interface que realizou unmarshaling.

Valor de Devolução

Um valor HRESULT padrão.

Exemplo

Confira o exemplo de AtlMarshalPtrInProc.

Confira também

Funções