Compartilhar via


Informações de HRESULT em código gerenciado

A interação entre código gerenciado e COM pode causar problemas quando os valores de retorno HRESULT são encontrados.

Em uma interface COM, um valor de retorno HRESULT pode executar essas funções:

  • Fornecer informações de erro (por exemplo, E_INVALIDARG).

  • Fornecer informações de status sobre o comportamento normal do programa.

Quando o COM chamar código gerenciado, HRESULTs podem causar esses problemas:

  • Funções COM que retornam valores HRESULT menor que zero (códigos de falha) geram exceções.

  • Os métodos COM que regularmente retornam dois ou mais códigos de sucesso de diferentes, por exemplo, S_OK ou S_FALSE, não podem ser diferenciadas.

Porque muitos da SDK do Visual Studio retornará valores HRESULT menor que zero ou retornam códigos diferentes de sucesso, de funções COM o SDK do Visual Studio assemblies de interoperabilidade foram escritos para que as assinaturas de método são preservadas. Todos os SDK do Visual Studio métodos de interoperabilidade são de int tipo. Valores HRESULT são passados por meio da camada de interoperabilidade sem alteração e sem gerar exceções.

Como uma função COM retorna um HRESULT para o método gerenciado que faz a chamada, o método de chamada deve verificar o HRESULT e lançar exceções conforme necessário.

HRESULTs de tratamento retornados ao código gerenciado do COM

Quando você chamar uma interface COM a partir do código gerenciado, examine o valor HRESULT e lançar uma exceção, se necessário. O ErrorHandler classe contém o ThrowOnFailure método que lança uma exceção COM, dependendo do valor do HRESULT é passado para ele.

Por padrão, ThrowOnFailure lança uma exceção, sempre que ele é passado um HRESULT que tem um valor menor que zero. Em casos onde tais HRESULTs são valores aceitáveis e nenhuma exceção deve ser lançada, os valores de HRESULTS adicionais devem ser passados para ThrowOnFailure depois que os valores são testados. Se o HRESULT que está sendo testado corresponde a todos os valores HRESULT explicitamente passados para ThrowOnFailure, nenhuma exceção é lançada.

Dica

O VSConstants classe contém constantes para HRESULTS comuns, por exemplo, S_OK e E_NOTIMPL, e Visual Studio HRESULTS, por exemplo, VS_E_INCOMPATIBLEDOCDATA e VS_E_UNSUPPORTEDFORMAT.VSConstantstambém fornece a Succeeded e Failed métodos, que correspondem do Succeeded método e Failed macros em COM.

Por exemplo, considere a seguinte chamada de função, na qual E_NOTIMPL é um valor de retorno aceitável, mas qualquer outro HRESULT menor que zero representa um erro.

Dim hr As Integer = MyInterface.MyFunction(cmdID)
ErrorHandler.ThrowOnFailure(hr, VSConstants.E_NOTIMPL)
int hr = MyInterface.MyFunction(cmdID);
ErrorHandler.ThrowOnFailure(hr, VSConstants.E_NOTIMPL);

Se houver mais de um retorno dos valores aceitáveis, valores adicionais de HRESULT apenas podem ser acrescentados à lista na chamada para ThrowOnFailure.

Dim hr As Integer = MyInterface.MyFunction(cmdID)
ErrorHandler.ThrowOnFailure(hr, VSConstants.E_NOINTERFACE, VSConstants.E_NOTIMPL)
int hr = MyInterface.MyFunction(cmdID);
ErrorHandler.ThrowOnFailure(hr, VSConstants.E_NOINTERFACE, VSConstants.E_NOTIMPL);

Retornando HRESULTS para COM a partir do código gerenciado

Se nenhuma exceção ocorre, gerenciado código retorna S_OK para a função COM que o chamou. Oferece suporte a interoperabilidade COM as exceções comuns que são fortemente tipadas em código gerenciado. Por exemplo, um método que recebe um inaceitável null argumento lança um ArgumentNullException.

Se não tiver certeza qual exceção throw, mas você sabe o HRESULT que você deseja retornar ao COM, você pode usar o ThrowExceptionForHR método para lançar uma exceção apropriada. Isso funciona mesmo com um erro de fora do padrão, por exemplo, VS_E_INCOMPATIBLEDOCDATA. ThrowExceptionForHRtenta mapear o HRESULT passado para ele uma exceção com rigidez de tipos. Se não for possível, ele lança uma exceção genérica de COM em vez disso. O resultado final é que o HRESULT passar para ThrowExceptionForHR do código gerenciado é retornado para a função COM que o chamou.

Dica

Exceções de comprometer o desempenho e servem para indicar as condições de finalização anormal do programa.As condições que ocorrem com freqüência devem ser manipulada in-line, em vez de uma exceção gerada.

Consulte também

Tarefas

Como mapear HRESULTs e exceções

Conceitos

compilando componentes COM para interoperação

Outros recursos

VSPackages gerenciados

Interoperação com código não gerenciado

VSPackages gerenciados