Главная » Delphi » Позднее и раннее связывание

0

Элементы автоматизации, которые рассматривались до сих пор в настоящей главе, работают  на   основе  подхода,   который  носит   название  позднего связывания   (late binding). В данном  случае  для вызова  необходимого метода  используется метод  In- voke() интерфейса IDispatch. Под поздним связыванием подразумевается, что вы зов метода невозможен до момента запуска программы, поскольку  необходимый адрес просто неизвестен. Во время  компиляции вызов  метода  автоматизации имеет  вид вы зова метода  IDispatch.Invoke() с соответствующими параметрами, и лишь во вре мя  выполнения программы метод  Invoke() вызовет  указанный метод  автоматиза ции.  При  вызове метода  автоматизации с помощью типа  Delphi  Variant или  Ole- Variant также   используется  позднее  связывание,  поскольку   транслятор  Delphi сначала  должен  будет организовать вызов  метод  IDispatch.GetIDsOfNames() для преобразования имени заданного метода в его параметр DispID, а затем уже реализо вать вызов  указанного метода  с помощью вызова  метода  IDispatch.Invoke() с по лученным параметром DispID.

Оптимизация за счет раннего связывания заключается в разрешении параметров DispID для вызываемых методов еще во время  компиляции, что  позволит избежать во время  выполнения приложения обращений к методу GetIDsOfNames(), перед  вызовом того или иного метода. Такая оптимизация часто называется связыванием ID (ID binding), или  связыванием идентификаторов, и обычно осуществляется при  вызове  методов с ис пользованием типа dispinterface Delphi.

Раннее связывание (early binding) происходит, когда объект автоматизации предос

тавляет свои методы  с помощью пользовательского интерфейса, производного от ин терфейса IDispatch. В этом случае контроллеры автоматизации могут вызывать объекты автоматизации непосредственно с помощью виртуальных таблиц   (vtable), т.е. без использования метода  IDispatch.Invoke(). Поскольку вызов  метода  осуще ствляется напрямую, то доступ к методу происходит быстрее, чем при позднем связы вании.  Раннее связывание используется при  вызове метода  с помощью типа  inter- face Delphi.

Об объекте автоматизации, который позволяет вызывать методы  с помощью как

метода  Invoke(), так и потомков интерфейса IDispatch, говорят как о поддержи вающем двойной интерфейс (dual interface). Объекты автоматизации, созданные в среде Delphi, всегда  поддерживают двойной  интерфейс,  а  контроллеры  автоматизации Delphi  позволяют вызывать методы  как с помощью метода  Invoke(), так  и напря мую — через интерфейс.

Регистрация

Разумеется, объекты автоматизации должны  создать  такие  же записи в системном реестре, как и обычные объекты COM:

HKEY_CLASSES_ROOT\CLSID\{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx}

Но все серверы автоматизации должны  создавать и дополнительный параметр ProgID, представляющий собой  строковый идентификатор класса автоматизации. Кроме   того,  создается параметр в ветви  HKEY_CLASSES_ROOT\(ProgID string), который содержит идентификатор CLSID класса  автоматизации, позволяющий с по мощью перекрестной ссылки вернуться к первой записи  реестра в разделе CLSID.

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии