Pregunta

estoy poniendo en práctica una interfaz COM que debe devolver los valores int ya sea S_OK E_FAIL o. Estoy bien regresar _ como consigo que detrás de otra llamada (Marshal.QueryInterface), pero si quiero devolver un valor de falla lo que el valor real lo uso para <=>?

(que es una cuestión fundamental, básica que es difícil encontrar una respuesta a)

Si se asume que es un número específico definido en la API Win32, ¿hay manera de utilizarla en el código .NET sin declarar mi propia constante?

Gracias!

Actualizar (contestado a continuación):

Tal vez estoy siendo un plonker completa, pero estoy teniendo problemas con esto. De acuerdo a mi SDK de la plataforma, HRESULT es un largo, que es un entero de 32 bits, ¿verdad? Así posibles valores -2,147,483,648 a 2147483647. Pero 0x80004005 = 2147500037 que es> 2147483647. Lo que da!?

Esto significa que cuando trato de poner esto en mi código:

const int E_FAIL = 0x80004005;

Me sale un error de compilación No se puede convertir implícitamente el tipo 'uint' a 'int'.

Actualización 2:

Voy a declarar de esta manera:

const int E_FAIL = -2147467259;

porque si trato de hacer algo como esto:

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

Me sale un error de compilador Valor constante '2147500037' no se puede convertir en un 'int' (uso 'sin control' para anular la sintaxis)

¡Uf! ¿Quién sabía lo difícil que sería declarar un valor de retorno estándar .... En algún lugar debe haber una clase oculta de que debería haber utilizado como volver Win32ReturnCodes.E <=> fallar; ... < em> suspiro

última solución:

Ahora hago esto consiguiendo el (enorme pero muy útil) enumeración de HRESULT pinvoke.net y agregarlo a mi solución. A continuación, utilice algo como esto:

return HRESULT.S_OK;
¿Fue útil?

Solución

E_FAIL es Hex 80004005 en Winerror.h

Puede ver el Winerror.h archivo aquí . Usted no tiene que instalar C ++ sólo para ver los valores.

ACTUALIZACIÓN:

Las versiones con y sin signo de 0x80004005 son sólo dos representaciones de la misma máscara de bits. Si usted está recibiendo un error de fundición a continuación, utilizar el valor con signo negativo. Cuando fundido a una ONU firmó tiempo va a ser el valor "correcto". Pruebe usted mismo en C #, que va a trabajar por ejemplo.

Este código

    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();
    }

producirá esta salida

  • Sin signo 2147500037
  • Firmado -2147467259
  • firmó como sin firmar 2147500037

Así que es seguro de usar -2147467259 por el valor de E_FAIL

Otros consejos

De Winerror.h para Win32

#define E_FAIL _HRESULT_TYPEDEF_(0x80004005L)

Para encontrar respuestas como esta, utilice la búsqueda de archivos de Visual Studio para buscar los archivos de cabecera en la VC Incluir directorio de su Visual Studio directorio de instalación.

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

Usar la palabra clave "sin control" para hacer esto.

por ejemplo.

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

VSConstants podría hacer que lo que desea:

VSConstants.S_OK Campo

HRESULT genérico para el éxito.

Espacio de nombres: Microsoft.VisualStudio

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

He utilizado este:

const int EFail = int.MinValue + 0x00004005;

a un compromiso entre la facilidad de lectura (si estás acostumbrado a los códigos hexadecimales) y C # 's restricción.

Usted debe descargar el SDK de la plataforma ( enlace )

He buscado a través del código y encontré lo siguiente en Winerror.h

typedef long HRESULT;

#ifdef RC_INVOKED
#define _HRESULT_TYPEDEF_(_sc) _sc
#else // RC_INVOKED
#define _HRESULT_TYPEDEF_(_sc) ((HRESULT)_sc)
#endif // RC_INVOKED

#define E_FAIL _HRESULT_TYPEDEF_(0x80004005L)
#define S_OK  ((HRESULT)0x00000000L)

Debe devolver E_FAIL en lugar del valor. Sólo tiene que incluir Winerror.h.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top