Question

Je suis mise en œuvre d'une interface COM qui doit retourner int valeurs soit ou S_OK E_FAIL. Je suis ok retour _ que je reçois ce retour d'un autre appel (Marshal.QueryInterface), mais si je veux retourner une valeur d'échec que la valeur réelle dois-je utiliser pour <=>?

(Il est une question fondamentale de base qu'il est difficile de trouver une réponse à)

En supposant qu'il est un nombre spécifique défini dans l'API Win32, est-il moyen de l'utiliser dans le code .net sans déclarer ma constante?

merci!

Mise à jour (réponse ci-dessous):

Peut-être que je suis un être plonker complet, mais je vais avoir des problèmes avec cela. Selon mon Platform SDK, HRESULT est une longue, qui est un entier signé 32 bits, non? Autant de valeurs possibles -2147483648 à 2147483647. Mais 0x80004005 = 2147500037 qui est> 2147483647. Ce qui donne!

Cela signifie que lorsque je tente de mettre cela dans mon code:

const int E_FAIL = 0x80004005;

Je reçois une erreur de compilateur ne peut pas convertir implicitement le type 'uint' à 'int'.

Mise à jour 2:

Je vais le déclarer comme ceci:

const int E_FAIL = -2147467259;

parce que si j'essaie de faire quelque chose comme ceci:

const UInt32 E_FAIL = 0x80004005;
return (Int32)E_FAIL;

Je reçois une erreur de compilation Valeur constante « 2147500037 » ne peut pas être converti en un « int » (utilisation non contrôlée »syntaxe pour remplacer)

Ouf! Qui savait combien il est difficile serait de déclarer une valeur de retour norme .... Quelque part il doit y avoir une classe qui se cache que je l'ai utilisé comme retour Win32ReturnCodes.E <=> FAIL; ... < em> soupirer

SOLUTION ULTIME:

Je le fais maintenant en obtenant le (massif mais très utile) HRESULT ENUM de pinvoke.net et l'ajouter à ma solution. Ensuite, utiliser quelque chose comme ceci:

return HRESULT.S_OK;
Était-ce utile?

La solution

E_FAIL est Hex 80004005 dans Winerror.h

Vous pouvez voir le plein Winerror.h déposer ici . Vous ne devez pas installer C ++ juste pour voir les valeurs.

Mise à jour:

Les signés et non signés versions de 0x80004005 ne sont que deux représentations du même masque de bits. Si vous obtenez une erreur coulée utiliser la valeur signée négative. Lorsque l'ONU à un casted signé de temps il sera la valeur « correcte ». Testez vous-même en C #, ça va marcher par exemple.

Ce code

    static void Main(string[] args)
    {
        UInt32 us = 0x80004005;
        Int32 s = (Int32)us;

        Console.WriteLine("Unsigned {0}", us);
        Console.WriteLine("Signed {0}", s);
        Console.WriteLine("Signed as unsigned {0}", (UInt32)s);

        Console.ReadKey();
    }

produira cette sortie

  • Unsigned 2147500037
  • Signé -2147467259
  • Signé comme non signé 2147500037

Il est donc sûr à utiliser -2147467259 pour la valeur de E_FAIL

Autres conseils

De Winerror.h pour Win32

#define E_FAIL _HRESULT_TYPEDEF_(0x80004005L)

Pour trouver des réponses comme celle-ci, utilisez la recherche de fichiers visual studio pour rechercher les fichiers d'en-tête dans le VC Include de votre studio visuel répertoire d'installation.

C:\Program Files\Microsoft Visual Studio 9.0\VC\include

Utilisez le mot-clé "sans contrôle" pour le faire.

par exemple.

const int E_FAIL = unchecked((int)0x80004005);

VSConstants pourrait voulez-vous que vous voulez:

VSConstants.S_OK Champ

HRESULT générique pour le succès.

Espace de noms: Microsoft.VisualStudio

Assembly: Microsoft.VisualStudio.Shell.10.0 (en Microsoft.VisualStudio.Shell.10.0.dll)

Je l'ai utilisé ceci:

const int EFail = int.MinValue + 0x00004005;

compromis entre lisibilité (si vous êtes habitué aux codes hexadécimaux) et de restriction C #.

Vous devez télécharger le kit de développement de plate-forme (

scroll top