СОМ как узнать нужное смещение для метода

Тема в разделе "WASM.BEGINNERS", создана пользователем deadly83, 19 апр 2008.

  1. deadly83

    deadly83 New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2007
    Сообщения:
    71
    Доброго времени суток!
    Читал о технологии СОМ и не понял на мой взгляд самого важного, а именно как узнать во всей куче указателей в памяти, указатель на нужный метод, например:
    имеем IHTMLDocument2 получаем на него указатель с помощью API ObjectFromLresult и записываем его в res. Теперь чтоб вызвать метод body описанный в MSDN как узнать где он будет валяться точнее узнать смещение относительное полученного res, а имеено вызвать call [res]+xx где хх бдует то самое смещение до нужного метода (он же body). И точно так же после получения указателя на новый спускаться дальше по лестнице методов пока не достигну нужного (в случае если отличаются от самого первого body)

    HRESULT IHTMLDocument2::get_body(IHTMLElement **p);
    трактуется как:
    push указатель в памяти на место куда будет получен указатель на IHTMLElement
    push указатель на текущий интерфейс IHTMLDocument2
    call [res]+xx
     
  2. Ursus

    Ursus Member

    Публикаций:
    0
    Регистрация:
    15 мар 2006
    Сообщения:
    238
    Адрес:
    Russia
    OMG! Указатель на COM-объект (IHTMLElement*, например), всегда указывает непосредственно на таблицу виртуальных функций (vtable). Которая, в свою очередь, представляет собой массив указателей на виртуальные функции (методы интерфейса). Элементы этого массива - указатели на виртуальные функции, в том же порядке, в каком методы объявлены в определении интерфейса (класса). Отсюда легко вывести нужное преобразование (мне это делать лень)

    Если, конешно, я правильно понял, что вопрос был о том, как из указателя на COM-объект получить указатель на конкретный метод.
     
  3. deadly83

    deadly83 New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2007
    Сообщения:
    71
    все ты правильно понял только вот не все так просто оказывается, забыл ты например что в начале каждой таблицы идут:
    IUnknown_QueryInterface_Proxy
    IUnknown_AddRef_Proxy
    IUnknown_Release_Proxy
    это уже +8 байт но даже если так все равно не сходится с MSDNоновкой последовательностью. Например в случае с IHTMLDocument2 метод body будет лежать по смещению 36 что соотвествует MSDN мануалу с учетом +8 байт в начале (body расположен 7-м по счету 7*4=28) 28+8=36 но вот незадача почему же тогда после получения IHTMLElement с помощью body хотим вызвать innerText (11*4=44) 44+8=52 вызываем и нифига не получаем что хотим?
     
  4. deadly83

    deadly83 New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2007
    Сообщения:
    71
    Кароче нашел то что искал, случайно наткнулся на ссылку http://www.japheth.de/ там есть программа такая COMView показывает кучу информации в том числе и смещения для методов.
     
  5. NoName

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    спасибо за хорошую ссылку