Смекни!
smekni.com

Структура и назначение программ в области информационных технологий (стр. 5 из 29)

19. Свойства интерфейсов COM

Если вы при разработке используете инструментальные средства VB, то вам повезло: VB скрывает от вас внутреннюю обработку интерфейсов СОМ. Однако если вы используете VC++, то вам потребуется выполнить дополнительную работу. Это - изучение языка задания интерфейсов IDL (Interface Definition Language) для компонентов VC++. При создании программного кода приложений важно иметь понятие о характеристиках интерфейсов, и о том, как они работают, независимо от того, используете вы VB или VC+. Особенности работы с интерфейсами следующие:

* Интерфейс не является классом, соответствующим обычному определению классов VB или VC++. При создании объекта из класса нельзя создать экземпляр интерфейса, поскольку это не повлечет его реализации. Интерфейс реализуется классом, и экземпляр должен быть создан именно из этого класса, чтобы стать объектом, предоставляющим интерфейс.

* Интерфейс не является объектом. Интерфейс представляет собой просто связанный набор функций и методов, с помощью которых клиенты и объекты обмениваются информацией. Когда у клиента есть доступ к объекту, он не имеет ничего, кро2

ме указателя интерфейса, с помощью которого он может обратиться к функциям интерфейса. В СОМ клиент может только вызывать функции интерфейса по имеющемуся указателю - это именно то, что позволяет СОМ обеспечивать эффективную поддержку стандарта бинарного кода, допускающего прозрачность месторасположения.

* Интерфейсы строго подразделены по типам. Каждый интерфейс имеет собственный уникальный идентификатор (GUID). Это предохраняет от конфликтов с другими интерфейсами. * Интерфейсы неизменны. Интерфейсы не имеют версий, что устраняет проблемы с версиями. Новая версия интерфейса, созданная добавлением или удалением функций или изменением его семантики, становится совершенно новым интерфейсом с новым идентификатором. Поэтому новый интерфейс не конфликтует со старым, даже если все изменения внесены.

20. Типы интерфейсов

Интерфейс IUnknown - единственный интерфейс, который компонент СОМ реализует в обязательном порядке. Если компонент должен быть доступен средствами языка сценариев, то нужно также реализовать интерфейс IDispatch.

Интерфейс IUnknown. Интерфейс IUnknown наиболее важен по сравнению с остальными интерфейсами. Его должен реализовывать каждый компонент СОМ. Все объекты СОМ реализуют интерфейс IUnknown, так как он управляет всеми интерфейсами объекта.

Интерфейс IUnknown содержит три метода: QueryInterface, AddrRef и Release. Эти методы были разработаны для программистов VC++. В среде VC++ метод Query Interface используется для выявления почти всех доступных интерфейсов объекта. Когда нужно использовать один из этих интерфейсов, вызывается метод AddRef. По завершении работы с отдельным интерфейсом вызывается метод Release.

Интерфейс IDispatch. Интерфейс IDispatch порождается интерфейсом IUnknown. Этот интерфейс первоначально был создан для удобства использования языков сценариев. Его использование не рекомендуется при разработке приложений (по причине роста накладных расходов), к которым не требуется доступ из языков сценариев.

Интерфейс IDispatch содержит функции, которые позволяют обращаться к методам и свойствам объектов COM. IDispatch позволяет VB и другим языкам создания сценариев управлять свойствами и методами объекта. Интерфейс IDispatch имеет два важных метода: Invoke и GetlDsOFNames. Метод GetlDsOFNames принимает код ID элемента, а метод Invoke выполняет остальную работу.

Пользовательские и двойственные интерфейсы. Пользовательский интерфейс - это интерфейс, не поддерживаемый в данный момент системой. Например, большинство интерфейсов OLE определяются самой операционной системой и имеют встроенную поддержку маршализации (marshaling - упаковка данных в сетевое сообщение). Если интерфейс используется только для общения с внутри процессным сервером (in-process server) (это сервер, исполняемый в том же процессе, что и клиент), то вам не нужно предоставлять код процедуры маршализации пакетов параметров, передаваемых между двумя процессами. С другой стороны, если интерфейс является пользовательским процессом, который не поддерживается операционной системой и может использоваться для связи между двумя процессами или машинами, то вы должны обеспечить код маршализации для передачи данных о параметрах за границы процесса, Обычно это трудоемкая и сложная работа, но последняя реализация компилятора Microsoft RFC MIDL (Remote Procedure Call Microsoft Interface Definition Language) позволяет автоматически сгенерировать требуемый код библиотек динамической компоновки (DLL). Для этого используют описания интерфейса на языке IDL (Interface Definition Language).

Фирма Microsoft настоятельно рекомендует предоставлять объекту двойственный интерфейс при использовании объекта в средствах автоматизации. Когда в объекте автоматизации реализованы оба интерфейса — IDispatch и VTBL — он называется компонентом с двойственным интерфейсом (dual-interface), В двойственном интерфейсе первые три пункта таблицы VTBL являются элементами интерфейса IUnknown, следующие четыре - элементами IDispatch, а последующие пункты - адресами элементов двойственного интерфейса. Все компоненты VB поддерживают двойственный интерфейс, так что вам не придется выполнять дополнительную работу по реализации класса, предоставляющего двойственный интерфейс.

21. Правила создания интерфейсов COM

Конструирование удаленного интерфейса. Модель СОМ предоставляет гибкие средства работы. При конструировании интерфейсов можно задать для аргумента метода любой тип данных. Одно из применений этого свойства состоит в конструировании интерфейса, который физически не может быть "удаленным".

Порождение интерфейсов из IUnknown. Интерфейсы СОМ порождаются прямо или косвенно из интерфейса IUnknown. Каждый интерфейс, реализованный в объекте СОМ, содержит методы Query Interface, AddRef и Release как свои первые три метода, расположенные в указанном порядке.

Интерфейс ISomething содержит четыре метода: QueryInterface, AddRef, Release и SomeMethod. Интерфейс ISomething-Else имеет пять методов: все методы ISomething и SomeOtherMethod.

Создание уникальных идентификаторов. "Настоящим" именем интерфейса является 128битовый идентификатор GUID, а не его удобочитаемое название. Для каждого вновь определяемого интерфейса должен быть сгенерирован новый идентификатор интерфейса, или IID

(Interface Identifier).

Программы uuidgen.exe или guidgen.exe предназначены для генерирования нового идентификатора GUID, который станет идентификатором IID вашего интерфейса. Программа UUIDGEN - это консольное приложение, которое является частью средств Microsoft RPC, a GUIDGEN — приложение Windows, входящее в средства Microsoft VC++. Эти утилиты работают одинаково, в конечном итоге вызывая функцию UuidCreate среды распределенных вычислений DCE (Distributed Computing Environment) RPC, входящую в интерфейсы прикладного программирования API (Application Programming Interface) исполняющей системы. (UUIDGEN вызывает UuidCreate напрямую, a GUIDGEN вызывает фун-кцию СоСгеateGuid библиотеки COM API, которая является оболочкой UuidCreate.)

Интерфейсы не изменяемы. Контракт интерфейса (interface contract), ассоциируемый с определенным HD, не может быть изменен после своего опубликования. Это правило гарантирует, что программное обеспечение может полагаться на неизменность интерфейса и его тождественность однажды опубликованному интерфейсу.

Функции возвращают значения типа HRESULT. Все методы интерфейса должны возвращать значение типа HRESULT. Это не относится к методам IUnknown::AddRef и IUnknown::Release, являющимся исключениями из правила.

Название HRESALT означает "handle to a result" - дескриптор результата, но оно не отражает точного смысла возвращаемого значения: это и не дескриптор, и не результат. Название HRESULT - это синоним термина SCODE (Status Code - код состояния).

Хотя функции интерфейса СОМ могут возвращать типы значений, отличные от HRESULT, сам конструируемый интерфейс сделать этого не может. Суть дела в том, что удаленная обработка данных СОМ должна возвращать вызвавшей их программе ошибки процедур RPC. Если вы определите методы с возвращаемыми типами, отличными от HRESULT, то у средств СОМ не будет возможности сообщить программе, вызвавшей метод, об аварийном отказе сервера или сбое в работе сети. Методы AddRef и Release специально определены так, что они не могут возвращать ошибку. Это и объясняет причину их исключения из правила.

Определение значений типа HRESULT. Спецификация СОМ устанавливает правила определения новых кодов состояния (значения HRESULT), Методы интерфейса СОМ и функции из библиотеки COM Library API используют специальное соглашение для кодов состояний, чтобы передавать возвращаемое значение, как полезное, обратно вызывающей программе, и информацию, сообщающую о текущем состоянии или ошибке. Например, весьма полезно, если функция возвращает результат типа Boolean (TRUE или FALSE), а также сообщает об успешном или ошибочном завершении.

Строковые параметры используют кодировку Unicode. Все строки, передаваемые любому интерфейсу СОМ (а в платформах Microsoft, все функции API), используют кодировку Unicode. Нет другого эффективного способа реализовать совместимость объектов в среде, поддерживающей независимость от вызова программой не всегда предоставляющей системный программный код для взаимодействия клиента с сервером.

22. Конструирование интерфейсов COM

Каждый интерфейс ответственен за документирование всей информации, описывающей контракт, предоставляемый интерфейсом. В контракте интерфейса СОМ содержатся следующие элементы:

• идентификатор интерфейса;

• сигнатура интерфейса (Interface signature);

• семантика интерфейса.

1) Идентификатор интерфейса.

Каждый интерфейс имеет идентификатор GLJID, который служит его программным именем. Он является кодом ID (IID), уникально идентифицирующим контракт, определенный интерфейсом. После того, как интерфейс, сконструированный с IID, компилируется в бинарный вид и вводится в действие, свойства, заданные в элементах интерфейса, изменять нельзя. Неизменность контракта интерфейса фундаментально важна для обеспечения эффективности и надежности средств СОМ. Имя интерфейса должно быть удобочитаемым, значит должно сообщать некую информацию о службах, предоставляемых интерфейсом. По принятому соглашению, имена интерфейсов должны начинаться с заглавной буквы.