COM в Ассемблере - Использование COM-объекта в Ассемблере
ОГЛАВЛЕНИЕ
Использование COM-объекта в Ассемблере
Доступ к COM-объекту осуществляется через указатель, который указывает на таблицу указателей на функции (эту таблицу еще называют таблицей виртуальных функций или vtable для краткости). Эта таблица содержит адреса каждого из методов объекта. Чтобы вызывать метод, вы косвенно вызываете его через эту таблицу указателей.
Здесь приводится пример интерфейса на C++, и как называются его методы:
interface IInterface
{
HRESULT QueryInterface( REFIID iid, void ** ppvObject );
ULONG AddRef();
ULONG Release();
Function1( INT param1, INT param2);
Function2( INT param1 );
}
// вызываем метод Function1
pObject->Function1( 0, 0);
То же самое можно реализовать на ассемблере следующим образом:
; определяем интерфейс
; каждое из этих значенией - это смещение в vtable
QueryInterface equ 0h
AddRef equ 4h
Release equ 8h
Function1 equ 0Ch
Function2 equ 10h
; вызываем метод Function1 на ассемблере
; вызываем метод, получая адрес таблицы виртуальных функций,
; а затем вызываем функцию через указатель, находящийся по
; нужному смещению в таблице
push param2
push param1
mov eax, pObject
push eax
mov eax, [eax]
call [eax + Function1]
Вы можете видеть, что это отличается от вызова обычной функции. Здесь pObject указывает на таблицу интерфейса. По смещению Function1 (0Ch) в этой таблице находится указатель на саму функцию, которую мы хотим вызвать.