COM в Ассемблере - Использование HRESULT

ОГЛАВЛЕНИЕ

 

Использование HRESULT

Возвращаемое значение функциями OLE API и методами является HRESULT. Это не хэндл чег-нибудь, а просто 32-х битное значение с несколькими полями. Части HRESULT показаны ниже.

HRESULT - это 32-х битное значение со следующей структурой.

  3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
  1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
 +-+-+-+-+-+---------------------+-------------------------------+
 |S|R|C|N|r|    Facility         |               Code            |
 +-+-+-+-+-+---------------------+-------------------------------+

  S - Severity Bit
      Используется для того, чтобы сообщить, была ли функция выполнена
      успешно или нет.

      0 - Успех
      1 - Провал

      Так как этот бит фактически является битом знака 32-х битного значения,
      проверить, успешно была выполнена функция или нет, можно просто
      проверив его знак:

      call       ComFunction        ; вызываем функцию
      test       eax,eax            ; теперь проверяем возвращенное значение
      js         error              ; делаем переход, если установлен бит
                                    ; знака (произошла ошибка)
      ; успех, продолжаем выполнение программы

  R - зарезервированная часть кода facility.

  C - зарезервированная часть кода facility.

  N - зарезервированная часть кода facility.

  r - зарезервированная часть кода facility

  Facility - это код facility

      FACILITY_WINDOWS    = 8
      FACILITY_STORAGE    = 3
      FACILITY_RPC        = 1
      FACILITY_WIN32      = 7
      FACILITY_CONTROL    = 10
      FACILITY_NULL       = 0
      FACILITY_ITF        = 4
      FACILITY_DISPATCH   = 2

      Чтобы получить этот код:

      call       ComFunction    ; вызываем функцию
      shr        eax, 16        ; сдвигаем HRESULT вправо на 16 бит
      and        eax, 1FFFh     ; маскируем биты так, что остается только
                                ; код facility
      ; теперь eax содержит HRESULT'овский код facility

  Code - код статуса facility

      Чтобы получить код статуса facility
      call       ComFunction             ; вызываем функцию
      and  eax, 0000FFFFh     ; обнуляем верхние 16 бит
      ; теперь eax содержит the HRESULT'овский код статуса facility