Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Тип данных Variant

Delphi обеспечивает поддержку клиентов автоматизации. Тип данных Variant может содержать ссылку на интерфейс IDispatch и использоваться для вызова его методов. Рассмотрим пример.

uses ComObj;

procedure TForm1.Button1Click(Sender: TObject);

var

V: Variant;

begin

V:= Create0le0bject('InternetExplorer.Application');

V.Toolbar:= FALSE;

V.Left:= (Screen.Width - 600) div 2;

V.Width:= 600;

V.Top:= (Screen.Height - 400) div 2;

V.Height:= 400;

V.Visible:= TRUE;

V.Navigate(URL:= 'file://C:\config.sys');

V.StatusText:= V.LocationURL;

Sleep(1000);

V.Quit;

End;

В этом примере

· переменная V не обладает ни одним из используемых свойств и методов; вызываемые свойства и методы нигде не описаны, однако это не ведет к ошибке компиляции;

· объект создается не по CLSID, а по информативному имени функцией CreateOleObject. Компилятор Delphi просто запоминает в коде программы строковые описания обращений к серверу автоматизации, а на этапе выполнения передает их интерфейсу IDispatch сервера, который и производит синтаксический анализ и выполнение. Если исправить третью строку процедуры следующим образом

V.Left1:= (Screen.Width - 600) div 2;

то, программа успешно откомпилируется, однако при попытке выполнения выдаст ошибку с сообщением, что метод Left1 не поддерживается сервером автоматизации.

Такое обращение к серверу, как уже упоминалось, называется поздним связыванием, означающим, что связывание имен свойств и методов объекта с их кодом происходит не на этапе компиляции, а на этапе выполнения программы.

Достоинства позднего связывания очевидны — не нужна библиотека типов, написание несложных программ упрощается. Столь же очевидны недостатки — не производится контроль вызовов и передаваемых параметров на этапе компиляции, работает приложение несколько медленнее, чем при раннем связывании.

Если СОМ-сервер находится в другом апартаменте, временные затраты на позднее связывание пренебрежимо малы по сравнению с затратами на маршалинг вызовов. Разница в скорости между ранним и поздним связыванием становится ощутимой (десятки и сотни раз) при нахождении клиента и сервера в одном апартаменте, что возможно только для внутрипроцсссного сервера при совместимой с клиентом модели потоков. Для внепроцессного сервера (сервера, размещенного в отдельном исполняемом файле) затраты на вызов метода путем раннего и позднего связывания практически равны.

Главным преимуществом раннего связывания является строгий контроль типов на этапе компиляции. Для разрешения проблемы нестрогого контроля типов СОМ предлагает несколько дополнительных возможностей.

<== предыдущая лекция | следующая лекция ==>
Интерфейс IDispatch | Маршалинг и взаимодействие клиента с сервером
Поделиться с друзьями:


Дата добавления: 2014-01-05; Просмотров: 291; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.012 сек.