Compartilhar via


Função CoReleaseMarshalData (combaseapi.h)

Destrói um pacote de dados marshaled anteriormente.

Sintaxe

HRESULT CoReleaseMarshalData(
  [in] LPSTREAM pStm
);

Parâmetros

[in] pStm

Um ponteiro para o fluxo que contém o pacote de dados a ser destruído. Consulte IStream.

Retornar valor

Essa função pode retornar os valores de retorno padrão E_FAIL, E_INVALIDARG, E_OUTOFMEMORY e E_UNEXPECTED, bem como os valores a seguir.

Código de retorno Descrição
S_OK
O pacote de dados foi destruído com êxito.
STG_E_INVALIDPOINTER
Um erro relacionado ao parâmetro pStm .
CO_E_NOTINITIALIZED
A função CoInitialize ou OleInitialize não foi chamada no thread atual antes de essa função ser chamada.

Comentários

Importante  

Observação de segurança: chamar esse método com dados não confiáveis é um risco à segurança. Chame esse método apenas quando você tiver dados confiáveis.

 
A função CoReleaseMarshalData executa as seguintes tarefas:
  1. A função lê um CLSID do fluxo.
  2. Se a implementação de marshaling padrão do COM estiver sendo usada, a função obterá um ponteiro IMarshal para uma instância do unmarshaler padrão. Se o marshaling personalizado estiver sendo usado, a função criará um proxy chamando a função CoCreateInstance , passando o CLSID que ele leu do fluxo e solicitará um ponteiro de interface IMarshal para o proxy recém-criado.
  3. Usando o ponteiro da interface IMarshal adquirido, a função chama IMarshal::ReleaseMarshalData.
Normalmente, você não chama essa função. A única situação em que talvez seja necessário chamar essa função é se você usar marshaling personalizado (escrever e usar sua própria implementação do IMarshal). Exemplos de quando CoReleaseMarshalData deve ser chamado incluem as seguintes situações:
  • Foi feita uma tentativa de desmarcar o pacote de dados, mas falhou.
  • Um pacote de dados marshaled foi removido de uma tabela global.
Como uma analogia, o pacote de dados pode ser considerado como uma referência ao objeto original, assim como se fosse outro ponteiro de interface sendo mantido no objeto . Como um ponteiro de interface real, esse pacote de dados deve ser liberado em algum momento. O uso de IMarshal::ReleaseMarshalData para liberar pacotes de dados é análogo ao uso de IUnknown::Release para liberar ponteiros de interface.

Observe que você não precisa chamar CoReleaseMarshalData após uma chamada bem-sucedida da função CoUnmarshalInterface ; essa função libera os dados marshal como parte do processamento que ele faz.

Importante Você deve chamar a função CoReleaseMarshalData no mesmo apartamento que chamou CoMarshalInterface para realizar marshaling do objeto no fluxo. A falha ao fazer isso pode fazer com que a referência de objeto mantida pelo pacote em marshaled no fluxo seja vazada.
 

Requisitos

Requisito Valor
Cliente mínimo com suporte Windows 2000 Professional [aplicativos da área de trabalho | Aplicativos UWP]
Servidor mínimo com suporte Windows 2000 Server [aplicativos da área de trabalho | Aplicativos UWP]
Plataforma de Destino Windows
Cabeçalho combaseapi.h (inclua Objbase.h)
Biblioteca Ole32.lib
DLL Ole32.dll

Confira também

IMarshal::ReleaseMarshalData