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