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