- •Проблемы, решаемые с помощью технологии com
- •Основные понятия
- •Именование com-объектов
- •Понятие интерфейса
- •Основы компиляции
- •Простейший пример использования
- •Интерфейс iUnknown
- •Еще один пример
- •Com-сервер
- •Создание "настоящего" com-сервера.
- •Фабрика классов
- •Использование фабрики классов
- •ITypeLib, iTypeInfo, библиотеки типов и информация о методах сервера. Язык idl.
- •IDispatch и вызов методов "по имени"
- •IMarshall, маршалинг и взаимодействие клиента с внутренними, локальными и удаленными серверами
- •Технология ole Внедрение и связывание объектов - ole
- •Использование ole-документов в приложениях
- •Использование свойств OleContainer
- •Создание элементов управления ActiveX Понятие ActiveX.
- •Создание элементов управления ActiveX на основе vcl-компонентов
- •Создание страниц свойств
- •Создание активных форм
- •Создание локальных серверов и контроллеров автоматизации Понятие автоматизации.
- •Создание приложения, подлежащего автоматизации
- •Превращение приложения в сервер автоматизации
- •Библиотека типов
- •Реализация методов объекта автоматизации
- •Создание контроллера
- •Раннее и позднее связывание
- •Создание контроллеров для произвольных серверов автоматизации
- •Коллекции объектов внутри серверов автоматизации
- •Использование информации из библиотек типов
- •Создание коллекций объектов
- •Экспонируемые свойства и методы
- •Процессы в Windows Процессы
- •Планирование потоков
- •Приоритеты
- •Привязка к процессорам
- •Создание процессов
- •Завершение процессов
- •Создание потоков
- •Завершение потоков
- •Wait функции
- •Синхронизация потоков
- •Синхронизация процессов
- •Взаимодействие между процессами
- •Создание внутренних серверов и контроллеров автоматизации Внутренний сервер автоматизации и передача данных
- •Создание внутреннего сервера автоматизации
- •Манипуляция ресурсами в dll
- •Работа внутреннего сервера автоматизации в многопоточном режиме Понятие многопоточности. Синхронизация
- •Класс tThread
- •Пример многопоточного приложения
- •Применение com-объектов, входящих в состав Windows Создание ярлыков
- •Использование Internet Explorer в приложениях
Создание приложения, подлежащего автоматизации
Для создания сервера автоматизации следует создать обычное приложение и затем добавить к нему описание класса СОМ-объектов, создаваемых этим приложением, для осуществления доступа к функциональности, которую нужно автоматизировать.
Разработаем простейший сервер автоматизации. С этой целью создадим обычное приложение, например текстовый редактор, содержащий инструментальную панель с четырьмя кнопками и компонент TMemo, а также диалоговые панели открытия и сохранения файла.
Создадим обработчики событий, связанные с нажатием на кнопки, и характерные для текстовых редакторов:
void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
{
Memo1->Lines->Clear ();
}
void __fastcall TForm1::SpeedButton2Click(TObject *Sender)
{
if (OpenDialog1->Execute ())
{
Memo1->Lines->LoadFromFile (OpenDialog1->FileName);
}
}
void __fastcall TForm1::SpeedButton3Click(TObject *Sender)
{
if (SaveDialog1->Execute ())
{
Memo1->Lines->SaveToFile (OpenDialog1->FileName);
}
}
void __fastcall TForm1::SpeedButton4Click(TObject *Sender)
{
Close ();
}
Сохраним проект. Отметим, что пока созданный нами текстовый редактор представляет собой обычное Windows-приложение и не является сервером автоматизации.
Превращение приложения в сервер автоматизации
Для превращения созданного нами выше приложения в сервер автоматизации выберем элемент Automation Object со страницы ActiveX репозитария объектов.
Введем имя класса, под которым данный класс СОМ-объектов будет зарегистрирован в реестре.
После этого мы окажемся в редакторе библиотеки типов (Type Library Editor), в котором нам предстоит определить свойства и методы созданного класса СОМ-объектов.
Библиотека типов
По существу библиотека типов представляет собой двоичный файл с описанием интерфейсов СОМ-объекта и их методов.
Обычно такие описания создаются с помощью специального языка IDL (Interface Definition Language) и используются для того, чтобы разработчики знали, как создать код, реализующий методы СОМ-объекта (или вообще методы объекта, расположенного за пределами адресного пространства разрабатываемого приложения, так как IDL используется не только в СОМ-технологии, но и в иных технологиях, реализующих вызовы удаленных процедур или функций, например CORBA). Помимо этого, описания методов на языке IDL могут быть использованы для автоматической генерации серверного и клиентского кода (так называемого proxy-кода и stub-кода) с помощью соответствующих утилит.
С другой стороны, proxy-код и stub-код для клиента и сервера могут быть сгенерированы динамически. В этом случае клиент должен динамически получать информацию о свойствах и методах интерфейсов СОМ-объекта, и тогда наличие библиотеки типов, содержащей такую информацию, может быть весьма удобно. Отметим, что библиотеку типов можно в принципе сгенерировать на основе описания на языке IDL с помощью специального компилятора MIDL, но в данном случае в этом нет необходимости.
Итак, приступим к редактированию библиотеки типов. Предположим, что мы хотим автоматизировать загрузку файла в окно редактора, сохранение набранного текста, очистку окна редактирования, определение и изменение ширины и видимости окна. Создадим также метод, добавляющий строку к редактируемому тексту. С этой целью опишем для нашего сервера методы FileNew,FileOpen,FileSave,AddLineи их параметры, а также свойстваWidthиVisible.
Отметим, что типы данных, используемые для описания параметров методов, не совпадают с типами данных C++, так как в этом случае используются типы данных, принятые в IDL. Наиболее часто используемые типы данных языка IDL приведены в таблице .
short |
2-байтовое целое число со знаком |
long |
4-байтовое целое число со знаком |
single |
4-байтовое действительное число |
double |
8-байтовое действительное число |
BSTR |
двоичная строка |
DATE |
дата |
VARIANT_BOOL |
true = -1, false = 0 |
VARIANT |
Указатель на вариантную переменную |
Отметим также, что наряду с типами данных IDL можно использовать все типы данных, определенные в самой библиотеке типов, а также в других библиотеках, на которые она ссылается.
МетодNewFileпараметров не имеет. МетодыOpenFileиSaveFileимеют один строковый параметр типаBSTR- имя файла. МетодAddLineтакже имеет один строковый параметр, задающий добавляемую строку. СвойствоVisibleимеет логический типVARIANT_BOOL, при этом оно может быть как прочитано, так и изменено. СвойствоWidthимеет целый типlong(число пикселов) и также доступно как для чтения, так и для записи.