IMarshal::GetMarshalSizeMax
9/8/2008
Esse método retorna um limite superior do número de bytes necessário para empacotar o ponteiro interface especificado no objeto especificado.
Syntax
HRESULT GetMarshalSizeMax(
REFIID riid,
void* pv,
DWORD dwDestContext,
void* pvDestContext,
DWORD mshlflags,
ULONG* pSize
);
Parameters
- riid
[no] Referência ao identificador da interface para ser empacotado.
- Vp
[no] Interface ponteiro para ser empacotado; pode ser NULL.
dwDestContext
[no] Contexto de destino em que a interface especificada deve ser unmarshaled.Valores para dwDestContext provenientes de enumeração MSHCTX.
Atualmente, desempacotamento pode ocorrer em outro compartimento do atual processo (MSHCTX_INPROC) ou em outro processo no mesmo computador como o atual processo (MSHCTX_LOCAL).
- pvDestContext
[no] Reservado para uso futuro; deve ser NULL.
- mshlflags
[no] Sinalizador que indica se os dados ser empacotado é para serem transmitidos voltar para o processo cliente — a maiúsculas e minúsculas Típica — ou gravado em uma tabela global, onde ele pode ser recuperado por múltiplo clientes. Os valores válidos provenientes de MSHLFLAGS enumeração.
- pSize
[out] Ponteiro para o limite superior na quantidade de dados a serem gravados para transmitir o empacotamento.
Return Value
O método suporta o padrão valor de retorno E_FAIL, bem como o seguinte:
- S_OK
O tamanho máximo foi retornado com êxito.
- E_NOINTERFACE
A interface especificada não foi com suporte.
Remarks
Este método é chamado indiretamente, em um chamar para CoGetMarshalSizeMax, por qualquer codificar no servidor processo é responsável por empacotamento um ponteiro para uma interface em um objeto.
Este codificar empacotamento é normalmente um stub gerado pelo COM para uma das várias interfaces que podem empacotar um ponteiro para uma interface implementado em um objeto inteiramente diferente. Um exemplos é o IClassFactory interface.
Para fins de discussão, a codificar responsável empacotamento um ponteiro está aqui chamado de stub empacotamento.
Para criar um proxy para um objeto, COM requer dois pedaços de informações a partir de original objeto: a quantidade de dados a serem gravados para transmitir o empacotamento e o proxy é CLSID.
O stub empacotamento obtém essas duas partes de informações com sucessivas chamadas para CoGetMarshalSizeMax e CoMarshalInterface.
Para determinar se a plataforma oferece suporte a esta interface, consulte Determinando suporte COM APIs.
Notas para chamadores
O stub empacotamento, por um chamar para CoGetMarshalSizeMax, chamadas implementação do objeto desse método para preallocate a reserva transmitir que será passada para IMarshal::MarshalInterface.
Não chamar explicitamente esse método se você estiver:
- Implementar interfaces COM existentes, ou
- Definir seu próprios personalizado interfaces, usando a Microsoft® Interface Definition Language (MIDL).
Em ambos os casos, o stub MIDL-generated automaticamente torna o chamar.
Se você não estiver usando MIDL para definir seu próprio interface (consulte Definindo interfaces COM), o stub empacotamento não é necessário chamar GetMarshalSizeMax, embora esse procedimento portanto, é altamente recomendável.
Um objeto sabe melhor do que um stub interface que é provavelmente será o tamanho máximo de uma pacote de dados empacotamento. Portanto, a menos que você está fornecendo um automaticamente o crescimento transmitir que é tão eficiente que a sobrecarga de expandindo-é, chamar este método mesmo quando implementar suas interfaces.
O valor retornado por esse método só é garantida seja válido, desde que o estado interno do objeto sendo empacotado não alteração. Portanto, o real empacotamento deve ser feito logo após essa função retorna, ou de stub é executada o risco que o objeto, because of alguma alteração no estado, talvez necessitam mais memória para empacotar que originalmente indicado.
Notas para Implementers
A implementação de MarshalInterface usará essa reserva para gravar dados empacotamento para a transmitir.
Se a reserva é muito pequena, a operação empacotamento falhará. Portanto, o valor retornado por esse método deve ser um estimar conservador da quantidade de dados que é necessário para empacotar a interface. Violação deste requisito deve ser tratada como um erro grave.
Em um chamar subseqüente para IMarshal::MarshalInterface, seu IMarshal implementação não é possível contar com o chamador realmente precisar chamado GetMarshalSizeMax antecipadamente. Ele ainda deve ser desconfiado STG_E_MEDIUMFULL erros retornados pela transmitir e esteja preparado para identificador-los normalmente.
Para garantir que sua implementação de GetMarshalSizeMax continuará para trabalho corretamente como novos contextos destino é com suporte In the future, delegado empacotamento para implementação usar como padrão do COM para todos dwDestContext Valores que sua implementação não entende.
Ao delegado empacotamento para implementação usar como padrão do COM, chamar o CoGetStandardMarshal função.
Requirements
Header | objidl.h, objidl.idl |
Library | ole32.lib, uuid.lib |
Windows Embedded CE | Windows CE 3.0 and later |
Windows Mobile | Windows Mobile Version 5.0 and later |