Partager via


Les informations HRESULT dans le code managé

L'interaction entre le code managé et COM peut provoquer des problèmes lorsque les valeurs de retour HRESULT sont produites.

Dans une interface COM, une valeur de retour HRESULT peut afficher ces rôles :

  • Indiquez les informations sur l'erreur (par exemple, E_INVALIDARG).

  • Fournissez des informations d'état à propos de le comportement du programme normal.

Lorsque les appels COM en code managé, HRESULT peut provoquer ces problèmes :

  • COM s'exécute que le HRESULT de retour est inférieur à zéro (codes d'échec) génèrent des exceptions.

  • Les méthodes COM qui retournent régulièrement codes de réussite moins deux différents, par exemple, S_OK ou S_FALSE, ne peuvent pas être distinguées.

Étant donné que de nombreux Kit de développement logiciel Visual Studio COM s'exécute les valeurs de retour HRESULT inférieur à zéro ou les différents codes de réussite de retour, des assemblys d'interopérabilité de Kit de développement logiciel Visual Studio a été spécifié afin que les signatures de méthode soient conservées. toutes les méthodes d'interopérabilité de Kit de développement logiciel Visual Studio sont de type d' int . Les valeurs HRESULT sont passées via la couche d'interopérabilité sans modification et sans générer des exceptions.

Étant donné qu'une fonction COM retourne un HRESULT à la méthode managée qui l'appelle, la méthode appelante doit vérifier le HRESULT et lever des exceptions selon vos besoins.

HRESULT de gestion retournés à du code managé COM

Lorsque vous appelez une interface COM de code managé, examinez la valeur HRESULT et lever une exception si nécessaire. La classe d' ErrorHandler contient la méthode d' ThrowOnFailure , qui lève une exception COM, selon la valeur de HRESULT qui lui est passé.

Par défaut, ThrowOnFailure lève une exception à chaque fois qu'il a passé un HRESULT qui a une valeur inférieure à zéro. Dans les cas où ce type de HRESULT sont des valeurs acceptées et aucune exception n'est levée, les valeurs des HRESULTS supplémentaires doivent être passées à ThrowOnFailure après que les valeurs soient testées. Si HRESULT en cours de correspondances testées que toutes les valeurs HRESULT sont explicitement passées à ThrowOnFailure, aucune exception n'est levée.

Notes

La classe d' VSConstants contient des constantes pour le mot commun des HRESULTS, par exemple, S_OK et E_NOTIMPL, et Visual Studio HRESULTS, par exemple, VS_E_INCOMPATIBLEDOCDATA et VS_E_UNSUPPORTEDFORMAT.VSConstants fournit également des méthodes d' Succeeded et d' Failed , qui correspondent à la méthode d' Succeeded et aux macros d' Failed dans COM.

Par exemple, considérez l'appel de fonction suivant, dans lequel E_NOTIMPL est une valeur de retour acceptable mais n'importe quel autre HRESULT inférieur à zéro représente une erreur.

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

S'il existe plusieurs valeurs de retour acceptables, des valeurs supplémentaires HRESULT peuvent uniquement être ajoutées à la liste dans l'appel à 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);

Retourner des valeurs HRESULT à COM à partir de le code managé

Si aucune exception ne se produit, retourne S_OK de code managé à la fonction COM qui l'a appelée. COM Interop prend en charge les exceptions courantes qui sont fortement typées en code managé. Par exemple, une méthode qui accepte un argument inacceptable d' null lève ArgumentNullException.

Si vous n'êtes pas certain que l'exception de lever, mais vous connaissent le HRESULT vous souhaitez retourner à COM, vous pouvez utiliser la méthode d' ThrowExceptionForHR pour lever une exception appropriée. Cela fonctionne même avec une erreur non standard, par exemple, VS_E_INCOMPATIBLEDOCDATA. les tentatives d'ThrowExceptionForHR de mapper le HRESULT sont passées à une exception fortement typée. Si elles ne peuvent pas, elles lèvent une exception générique de COM. Le résultat final sera que le HRESULT que vous passez à ThrowExceptionForHR de code managé est retourné à la fonction COM qui l'a appelé.

Notes

Les exceptions affectent les performances et sont conçus pour indiquer des rapports anormaux de programme.Les conditions qui se produisent fréquemment doivent être inline géré, au lieu d'une exception levée.

Voir aussi

Tâches

Comment : mapper des HRESULT et des exceptions

Concepts

Génération de composants COM pour l'interopérabilité

Autres ressources

VSPackages managé

Interopération avec du code non managé

VSPackages managé