Страница 2 из 5 Использование 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) в этой таблице находится указатель на саму функцию, которую мы хотим вызвать. |