COM в Ассемблере Страница 3. Использование HRESULT
|
Страница 3 из 5 Использование 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 |