maxSDK

Тема в разделе "WASM.GRAPHICS", создана пользователем Tiro, 24 окт 2006.

  1. Tiro

    Tiro New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2006
    Сообщения:
    49
    Адрес:
    Russia
    В заголовочных файлах да и в MaxsdkHelp указано что класс Interface является абстрактным. Но в примерах, прилагаемых к sdk, вызываются методы этого класса через указатель типа Interface:

    Код (Text):
    1. void AppDataTest::BeginEditParams(Interface *ip,IUtil *iu)
    2.     {
    3.     this->iu = iu;
    4.     this->ip = ip;
    5.     hPanel = ip->AddRollupPage(
    6.         hInstance,
    7.         MAKEINTRESOURCE(IDD_APPDATA_PANEL),
    8.         AppDataTestDlgProc,
    9.         GetString(IDS_RB_APPDATATEST),
    10.         0);
    11.     }
    AppDataTest производный другого абстрактного класса:
    class AppDataTest : public UtilityObj
    Функция BeginEditParams является виртуальной пустой.
    Т.е. с одной стороны класс Interface абстрактный, с другой про класс Interface в sdk говорится что:
    Где реализованы пустые функции класса Interface ? Нет ли здесь противоречия с теорией?
     
  2. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    нету. а где и как они реализованы, тебя не должно волновать, для того и ООП.

    указатель ip -- это указатель на инстанс какого-то класса, который и реализует пустые функции класса Interface.
     
  3. Tiro

    Tiro New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2006
    Сообщения:
    49
    Адрес:
    Russia
    Интересно, всё же. Иначе я не задал бы этот вопрос.

    Thk's
     
  4. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    В COM модели ip является адресом таблицы с адресами функций.
    Соответсвенно функция инициализации интерфейса заполняет эту таблицу и возвращает указатель на неё. Т.е. в данном случае реализуется вызов функции по её порядковому номеру (соответствие номера функции с её текстовым именем описано в заголовочных файлах, а в exe компилируется только её номер). В dll интерфейсах такой метод считается устаревшим и поддерживается только для совместимости, а в COM вот прижился за счёт запрета на любые изменения в уже опубликованном интерфейсе (можно только создать новый интерфейс с теми же чуть чуть изменёнными функциями ;).
     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    [off]
    Всегда интересовало, почему там не рулит наследование? Зачем плодить кучку схожих ифейсов, наследованных от IUnknown или IDispatch, вместо того, чтобы наследоваться друг от друга?
    [/off]
     
  6. Tiro

    Tiro New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2006
    Сообщения:
    49
    Адрес:
    Russia
    IceStudent

    Может быть при этом происходит экономия памяти ?
     
  7. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    IceStudent
    учите матчасть!
     
  8. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    В общих чертах основная идея в том, что если разрешить менять уже опубликованный интерфейс как заблагорассудится, то наплодится куча несовместимых версий и программы начнут обвально падать ;) (законы Мерфи рулят ;) Поэтому и ввели "правила игры" - прикладники могут наследовать внутри своей программы сколько угодно, а вот разработчики объектов с открыто публикуемым интерфейсом обязаны четко отделять новую версию от старой.
    В dll с экспортом функций по имени можно просто добавить к имени Ex и всем станет понятно, что это новая версия функции с возможно другими аргументами, а когда у функции есть только порядковый номер, то остаётся либо дико растягивать виртуальную таблицу забивая её однотипными функциями (что совсем уж не есть гуд и потому запрещено), либо полностью создавать новый интерфейс, который можно отличить от старого по GUID.
     
  9. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    censored
    А ткнуть в мануал? Всё подряд учить не катит.

    Y_Mur
    То есть, нельзя даже опубликовать расширенный интерфейс старого, только совершенно новый?
     
  10. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    В принципе часто новый интерфейс на самом деле расширенный старый, но M$ не рекомендует совместно использовать функции из разных интерфейсов посколько несмотря на внешнюю одинаковость их внутренняя реализация может конфликтовать со старой версией (а может и сработать, т.е. никаких гарантий). Из-за этого и обязали вводить новый GUID. Хотя если пишешь для себя, то никому ничего не должен и можно перекраивать и наследовать как удобнее :))
     
  11. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    По мануалу - достаточно популярно изложено в: Дональд Бокс. Сущность технологии СОМ. (не помню где взял, можно поискать по EssentialCOM_rus.chm)
    Еще есть перевод DirectX2 SDK http://hworld3000.chat.ru/files/directx.exe, интересно, что там надпись о непредсказуемости результатов смешивания интерфейсов следует сразу за примером, где это смешивание происходит :))
     
  12. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Y_Mur
    Ага, спасибо. Книга есть, гляну на досуге. Но вопрос всё равно спорный, конечно. Хотя в свете поддержки всех и вся (бинарных реализаций ООП в языках) в СОМ становится понятнее.
     
  13. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Еще новый GUID при добавлении функции в неизменяемый интерфейс - подстраховка от случая когда разные программеры независимо друг от друга добавят (и опубликуют) новые функции, которые в итоге окажутся под одним номером :) (имена то только в *.h)
    А COM интерфейсы различающиеся по GUID придумали потому что dll, различающиеся только именем файла либо не исключают взаимного затирания, либо теряют своё основное достоинство - возможность свалить их в кучу и использовать совместно ;)