Саммерфилд Марк
Шрифт:
• можно использовать макросы QAXFACTORY_BEGIN, QAXFACTORY_END, QAXCLASS и QAXTYPE для объявления и регистрации фабрики классов. В этом случае потребуется использовать макрос Q_CLASSINFO для определения идентификаторов класса и интерфейса.
Вернемся к определению класса AddressBook. Третий вызов макроса Q_CLASSINFO может показаться немного странным. По умолчанию элементы управления ActiveX предоставляют в распоряжение клиентов не только свои собственные свойства, сигналы и слоты, но и свои суперклассы вплоть до QWidget. Атрибут ToSuperClass позволяет определить суперкласс самого высокого уровня (в дереве наследования), который мы собираемся предоставить клиенту. Здесь мы указываем имя класса компонента («AddressBook») в качестве имени экспортируемого класса самого высокого уровня — это значит, что не будут экспортироваться свойства, сигналы и слоты, определенные в суперклассах AddressBook.
Класс ABItem представляет один элемент в адресной книге. Он наследует QTreeWidgetItem и поэтому может отображаться в QTreeWidget, и он также наследует QObject и поэтому может экспортироваться как объект СОМ.
В функции main мы проверяем, в каком качестве работает приложение: как автономное приложение или как сервер. Опция командной строки —activex распознается объектом QApplication и обеспечивает работу приложения в качестве сервера. Если приложение не является сервером, мы создаем главный виджет и выводим его на экран, как мы обычно делаем для любого автономного приложения Qt.
Кроме опции —activex серверы ActiveX «понимают» следующие опции командной строки:
• —regserver — регистрация сервера в системном реестре;
• —unregserver — отмена регистрации сервера в системном реестре;
• —dumpidl файл — записывает описание сервера на языке IDL (Interface Description Language — язык описания интерфейсов) в указанный файл.
Когда приложение выполняет функции сервера, нам необходимо экспортировать классы AddressBook и ABItem как компоненты СОМ:
Приведенные выше макросы экспортируют фабрику классов для создания объектов СОМ. Поскольку мы собираемся экспортировать два типа объектов СОМ, мы не можем просто использовать макрос QAXFACTORY_DEFAULT, как мы делали в предыдущем примере.
Первым аргументом макроса QAXFACTORY_BEGIN является идентификатор библиотеки типов; второй аргумент представляет собой идентификатор приложения. Между макросами QAXFACTORY_BEGIN и QAXFACTORY_END мы указываем все классы, которые могут быть инстанцированы, и все типы данных, доступные как объекты СОМ.
Ниже приводится файл .pro для внепроцессного сервера ActiveX: