Идентификация объектов в COM - как устроено?

Тема в разделе "WASM.BEGINNERS", создана пользователем Dmitry_Milk, 9 фев 2012.

  1. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    Пытаюсь разбираться, что представляет из себя работа с COM-объектами на низком уровне с точки зрения приложения.
    Понял, что так или иначе получаемые интерфейсы - это (указатели на) структуры, содержащие в своих полях указатели на методы.

    Вижу, что эти методы с точки зрения приложения - обычные функции, не thiscall. В аргументах тоже не предается никаких this или еще каких-либо идентификаций объекта или хотя бы адреса той же самой структуры/интерфейса, из которой я имею адрес метода. То есть, в метод при вызове не попадает никакой информации о том, к чему именно они применяются. И вот тут у меня возникает непонятка - как вообще различаются между собой разные, но однотипные объекты, полученные одинаковым путем? Понятно, что для каждого объекта будет своя структура/интерфейс, но ведь адрес этой структуры в методы никак не попадает?
     
  2. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    Объекты COM имеют виртуальную таблицу с указателями на методы интерфейса, указатель на таблицу (vtable) первое поле каждого объекта.
    Указатель на объект идет первым (заталкивается в стек последним) аргументом каждого вызова.

    pObject->QueryInterface (iid, ppv);
    В стеке будет:

    адрес возврата
    pObject
    iid
    ppv
     
  3. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    А, так все-таки аргументом передается. Где-то я не так поглядел. Спасибо :)
     
  4. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    Dmitry_Milk
    Вы просмотрели декларацию вызовов , там везде будет __stdcall , (x64 как __fastcall).

    Squash
    а вот не совсем, посмотрите ATL( DirectX DXGIFactory ), там более хитрый ипл, что бы не бухли таблицы, но в целом таки да , первый элемент будет указатель на текущию виртуальную таблицу ...
     
  5. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    shchetinin, я и так в курсе, что ваши знания необъятны ;)
     
  6. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    Squash
    Стибаитесь ? Просто мне показалось это забавным особенно когда хочешь это все перехватить и кажится сто решение, а на самом деле не все так просто, поэтому и порекомендовал, так как это очень забавно!

    П.С proxy objects - не подходят так как иногда происходит прямые вызовы .. Полный патчи таблиц тоже каряво.. А еще время жизни объектов и многое другое:)
     
  7. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    Лучше расскажите мне, как оле элементы свои свойства в контейнерах хранят. Есть у них единая схема, или каждый кто во что горазд?
     
  8. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    Squash
    Что есть свойства ? Get\Set акцесоры?:
     
  9. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    Они, родимые.
     
  10. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    Squash
    НА сколько помню это обычные функты, а установка их похожая на ATL::QueryIntreface(Поиск объектов )
     
  11. _Juicy

    _Juicy Active Member

    Публикаций:
    0
    Регистрация:
    12 авг 2003
    Сообщения:
    1.159
    Адрес:
    SPb
    Ммм... нет, кажется это не совсем та степь :)