Я реализую COM-интерфейс, который должен возвращать значения int S_OK
или E_FAIL
. Я нормально возвращаю S_OK
, поскольку получаю это от другого вызова (Marshal.QueryInterface), но если я хочу вернуть значение отказа, какое фактическое значение я использую для E_FAIL
?
(Это такой фундаментальный фундаментальный вопрос, что трудно найти ответ)
Предполагая, что это конкретный номер, определенный в Win32 API, есть способ использовать его внутри .net-кода без объявления моей собственной константы?
спасибо!
Обновление (см. ниже):
Может быть, я полный плункер, но у меня проблемы с этим. Согласно моей платформе 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" (используйте "непроверенный" синтаксис для переопределения)
Уф! Кто знал, насколько сложно было бы объявить стандартное возвращаемое значение.... Где-то должен быть класс, скрывающийся, что я должен был бы использовать как вернуть Win32ReturnCodes.E _
FAIL;... вздох
ULTIMATE SOLUTION:
Теперь я сделаю это, получив (массивное, но очень полезное) перечисление HRESULT из pinvoke.net и добавив его в мое решение. Затем используйте его примерно так:
return HRESULT.S_OK;