Понятие интерфейса. Язык описания интерфейсов IDL (MIDL)

Ключевым моментом, на котором основана модель COM, является понятие интерфейса.

Интерфейс, образно говоря, является «контрактом» между программистом и компилятором. Программист обязуется реализовать все методы, описанные в интерфейсе, и следовать требованиям, предъявляемым к реализации некоторых их них.

Компилятор обязуется создать в программе внутренние структуры, позволяющие обращаться к методам этого интерфейса из любого поддерживающего те же соглашения средства программирования. Таким образом, COM является языково-независимой технологией и может использоваться в качестве «клея», соединяющего программы, написанные на разных языках.

Объявление интерфейса включает в себя описание методов и их параметров, но не включает их реализации. Кроме того, в объявлении может указываться идентификатор интерфейса — уникальное 16-байтовое число, сгенерированное по специальным правилам, гарантирующим его статистическую уникальность (GUID — Global Unique Identifier). Тип данных GUID, который применяется для идентификации COM-интерфейсов называется IID.

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

Спецификация COM предполагает, что компоненты могут выполняться в разных адресных пространствах. При этом, при передаче управления (запуске) компонента возникает ситуация передачи параметров из одного адресного пространства в другое. Это процесс называется маршаллингом. Маршаллинг основывается на шаблоне Remote Proxy. В COM представлены спецификации стандартной реализации IMarshal, а для некоторых интерфейсов и код заместителей/заглушек. Программисту остается это только реализовать. Однако, язык определения COM-интерфейсов IDL (MS Interface Definition Language) позволяет этот процесс упростить. Описав компонент на IDL, после компиляции можно получить реализацию компонента на C/C++ с кодом заглушки/заместителя. На вход компилятора-IDL подается код на языке IDL. На выходе (после компиляции) получается программный код на языке высокого уровня. Чаще всего это C++. Замечание: язык IDL не является частью спецификации COM. Он является первичным языком технологии CORBA. Однако, в COM может быть использован факультативно.

Ниже приведен пример описания интерфейса на MIDL.

[

uuid(F3792A83-69C9-11D2-AC8C-525400DDA17A),

helpstring("Этот интерфейс определяет методы работы со стеком.")

]

interface IStack : IUnknown

{

HRESULT Push([in] VARIANT Val);

HRESULT Pop([out, retval] VARIANT *pVal);}

26. Стандартная библиотека шаблонов STL. Основные концепции: контейнер, алгоритм, итератор, поток.

STL (Standard Template Library) обеспечивает общецелевые, стандартные классы и функции, которые реализуют наиболее популярные и широко используемые алгоритмы и структуры данных.

Ядро STL образуют три основополагающих элемента: контейнеры, алгоритмы и итераторы. Эти элементы функционируют в тесной взаимосвязи друг с другом, обеспечивая искомые решения проблем программирования.

Контейнеры – объекты, предназначенные для хранения других объектов. Бывают различных типов, например, в классе vector определяется динамический массив, в классе queue – очередь, в классе list – линейный список. В каждом классе-контейнере определяется набор функций для работы с этим контейнером. Например, список содержит функции для вставки, удаления и слияния элементов. В стеке имеются функции для размещения элемента в стеке и извлечения его из стека.

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

Итераторы – это объекты, которые по отношению к контейнерам играют роль указателей. Они позволяют получать доступ к содержимому контейнера примерно так же, как указатели используются для доступа к элементам массива. Имеется 5 типов итераторов: 1) произвольного доступа (для считывания и записи значений; доступ к элементам произвольный); 2) двунаправленный (для считывания и записи значений; может проходить контейнер в обоих направлениях); 3) однонаправленный (для считывания и записи значений; может проходить контейнер в одном направлении); 4) ввода (для считывания значений, может проходить контейнер в одном направлении); 5) вывода (для записи значений, может проходить контейнер в одном направлении).

С итераторами можно работать как с указателями. Над ними можно выполнять операции инкремента и декремента. К ним можно применить оператор *.

Потоков в STL нет.