Какие значения вернуть для S_OK или E_FAIL из кода c # .net?

Я реализую COM - интерфейс , который должен возвращать Int значения либо S_OKили E_FAIL. Я в порядке, возвращаясь, S_OKкогда я получаю это обратно от другого вызова (Marshal.QueryInterface), но если я хочу вернуть значение ошибки, для какого фактического значения я использую E_FAIL?

(Это такой фундаментальный вопрос, на который трудно найти ответ)

Предполагая, что это определенное число, определенное в Win32 API, есть ли способ использовать его в коде .net, не объявляя мою собственную константу?

Спасибо!

Обновление (ответ ниже):

Может быть, я полный плонкер, но у меня проблемы с этим. Согласно моему Platform SDK, HRESULT - это LONG, то есть 32-разрядное целое число со знаком, верно? Возможные значения: от 2 147 483 648 до 2 147 483 647. Но 0x80004005 = 2 147 500 037, что> 2 147 483 647. Что дает!?

Это означает, что когда я пытаюсь вставить это в мой код:

const int E_FAIL = 0x80004005;

Я получаю сообщение об ошибке компилятора. Невозможно неявно преобразовать тип 'uint' в 'int'.

Обновление 2:

Я собираюсь объявить это так:

const int E_FAIL = -2147467259;

потому что если я попытаюсь сделать что-то вроде этого:

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

Я получаю ошибку компилятора. Значение константы «2147500037» не может быть преобразовано в «int» (используйте «unchecked» синтаксис для переопределения)

Уф! Кто знал, как сложно было бы объявить стандартное возвращаемое значение .... Где-то должен быть скрытый класс, который я должен был использовать, например return Win32ReturnCodes.E _FAIL; ... вздох

СОВЕРШЕННОЕ РЕШЕНИЕ:

Теперь я делаю это, получая (массивное, но очень полезное) перечисление HRESULT от pinvoke.net и добавляя его в мое решение. Затем используйте это примерно так:

return HRESULT.S_OK;
12.12.2008 14:12:08
6 ОТВЕТОВ
РЕШЕНИЕ

E_FAIL - это Hex 80004005 в WinError.h

Вы можете увидеть полный файл WinError.h здесь . Вам не нужно устанавливать C ++ только для просмотра значений.

ОБНОВИТЬ:

Подписанные и неподписанные версии 0x80004005 являются всего лишь двумя представлениями одной и той же битовой маски. Если вы получаете ошибку приведения, используйте отрицательное значение со знаком. При приведении к длинной подписи ООН это будет «правильное» значение. Попробуйте сами в C #, это будет работать, например

Этот код

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

будет производить этот вывод

  • Unsigned 2147500037
  • Подпись -2147467259
  • Подписано как неподписанное 2147500037

Так что безопасно использовать -2147467259 для значения E_FAIL

8
6.09.2013 10:36:53
Ссылка умерла, см. Общие значения HRESULT здесь
bland 5.09.2013 20:05:19
Я обновил ссылку winerror.h, там много ссылок, на случай, если ссылка снова разорвется, ее получит очень простой поиск (также, если на вашей машине есть компилятор C ++, вероятно, будет WinError.h файл там)
Binary Worrier 6.09.2013 10:38:49

Из WinError.h для Win32

#define E_FAIL _HRESULT_TYPEDEF_(0x80004005L)

Чтобы найти такие ответы, используйте поиск файлов Visual Studio для поиска файлов заголовка в каталоге VC Include каталога установки Visual Studio.

C:\Program Files\Microsoft Visual Studio 9.0\VC\include
7
12.12.2008 14:19:36

Вам необходимо скачать платформу SDK ( ссылка )

Я искал код и нашел следующее в 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)

Вы должны вернуть E_FAIL вместо значения. Просто включите winerror.h.

-1
12.12.2008 14:23:59
Он отметил свой пост C #, поэтому он не может включить его и должен определить его сам, таким образом, вопрос. Это очень распространено в COM и PInvoke'ing.
Rob Prouse 12.12.2008 14:33:44

Я использовал это:

const int EFail = int.MinValue + 0x00004005;

компромисс между удобочитаемостью (если вы привыкли к шестнадцатеричным кодам) и ограничением C #.

1
31.01.2010 04:13:24

Используйте ключевое слово «unchecked», чтобы сделать это.

например

const int E_FAIL = unchecked((int)0x80004005);
4
5.12.2012 22:49:40

VSConstants может вы хотите, что вы хотите:

Поле VSConstants.S_OK

Общий HRESULT для успеха.

Пространство имен: Microsoft.VisualStudio

Сборка: Microsoft.VisualStudio.Shell.10.0 (в Microsoft.VisualStudio.Shell.10.0.dll)

3
4.12.2013 18:07:03