Spec-Zone.ru › Qt 5.15

Класс QAxFactory

Класс QAxFactory определяет фабрику для создания компонентов COM. Подробнее...

Заголовок: #include <QAxFactory>
qmake: QT += axserver
Наследует: QObject
  • Список всех членов, включая унаследованные
  • Устаревшие члены

Типы публичного доступа

Перечисление ServerType { SingleInstance, MultipleInstances }

Функции публичного доступа

QAxFactory(const QUuid &libid, const QUuid &appid)
virtual ~QAxFactory() override
virtual QUuid appID() const
virtual QUuid classID(const QString &key) const
virtual QObject * createObject(const QString &key) = 0
virtual bool createObjectWrapper(QObject *object, IDispatch **wrapper)
virtual QUuid eventsID(const QString &key) const
virtual QString exposeToSuperClass(const QString &key) const
virtual QStringList featureList() const = 0
virtual bool hasStockEvents(const QString &key) const
virtual QUuid interfaceID(const QString &key) const
virtual bool isService() const
virtual const QMetaObject * metaObject(const QString &key) const = 0
virtual void registerClass(const QString &key, QSettings *settings) const
virtual bool stayTopLevel(const QString &key) const
virtual QUuid typeLibID() const
virtual void unregisterClass(const QString &key, QSettings *settings) const
virtual bool validateLicenseKey(const QString &key, const QString &licenseKey) const

Статические члены публичного доступа

bool isServer()
bool registerActiveObject(QObject *object)
QString serverDirPath()
QString serverFilePath()
bool startServer(QAxFactory::ServerType type = MultipleInstances)
bool stopServer()

Макросы

QAXCLASS(Class)
QAXFACTORY_BEGIN(IDTypeLib, IDApp)
QAXFACTORY_END
QAXFACTORY_EXPORT(Class, LibID, AppID)
QAXTYPE(Class)

Подробное описание

Реализуйте эту фабрику один раз в своем сервере COM, чтобы предоставить информацию о компонентах, которые может создать сервер. Подклассируйте QAxFactory и реализуйте чистые виртуальные функции в любом файле реализации (например, main.cpp), и экспортируйте фабрику с помощью макроса QAXFACTORY_EXPORT().

QStringList ActiveQtFactory::featureList() const
{
    QStringList list;
    list << "ActiveX1";
    list << "ActiveX2";
    return list;
}

QObject *ActiveQtFactory::createObject(const QString &key)
{
    if (key == "ActiveX1")
        return new ActiveX1(parent);
    if (key == "ActiveX2")
        return new ActiveX2(parent);
    return 0;
}

const QMetaObject *ActiveQtFactory::metaObject(const QString &key) const
{
    if (key == "ActiveX1")
        return &ActiveX1::staticMetaObject;
    if (key == "ActiveX2")
        return &ActiveX2::staticMetaObject;
}

QUuid ActiveQtFactory::classID(const QString &key) const
{
    if (key == "ActiveX1")
        return "{01234567-89AB-CDEF-0123-456789ABCDEF}";
    ...
    return QUuid();
}

QUuid ActiveQtFactory::interfaceID(const QString &key) const
{
    if (key == "ActiveX1")
        return "{01234567-89AB-CDEF-0123-456789ABCDEF}";
    ...
    return QUuid();
}

QUuid ActiveQtFactory::eventsID(const QString &key) const
{
    if (key == "ActiveX1")
        return "{01234567-89AB-CDEF-0123-456789ABCDEF}";
    ...
    return QUuid();
}

QAXFACTORY_EXPORT(
    ActiveQtFactory,                          // factory class
    "{01234567-89AB-CDEF-0123-456789ABCDEF}", // type library ID
    "{01234567-89AB-CDEF-0123-456789ABCDEF}"  // application ID
)

Если вы используете макрос Q_CLASSINFO() для предоставления уникальных идентификаторов или других атрибутов для вашего класса, вы можете использовать макросы QAXFACTORY_BEGIN(), QAXCLASS() и QAXFACTORY_END() для экспонирования одного или нескольких классов как объектов COM.

QAXFACTORY_BEGIN(
    "{01234567-89AB-CDEF-0123-456789ABCDEF}", // type library ID
    "{01234567-89AB-CDEF-0123-456789ABCDEF}"  // application ID
)
    QAXCLASS(Class1)
    QAXCLASS(Class2)
QAXFACTORY_END()

Только одна реализация QAxFactory может быть создана и экспортирована приложением сервера ActiveX. Этот экземпляр доступен через глобальную функцию qAxFactory().

Фабрика также может переопределить функции registerClass() и unregisterClass() для установки дополнительных флагов для управления ActiveX-контроля в реестре. Для ограничения количества методов или свойств, которые класс виджета экспонирует от своих родительских классов, переопределите exposeToSuperClass().

См. также QAxAggregated, QAxBindable и Фреймворк ActiveQt.

Документация по типам членов

Перечисление QAxFactory::ServerType

Это перечисление определяет различные типы серверов, которые могут быть запущены с помощью startServer.

Константа Значение Описание
QAxFactory::SingleInstance 0 Процесс сервера может создать только один экземпляр каждого экспортированного класса. COM запускает новый процесс для каждого запроса. Обычно используется в серверах, которые экспортируют только один создаваемый класс.
QAxFactory::MultipleInstances 1 Сервер может создавать несколько экземпляров каждого экспортированного класса. Это значение по умолчанию. Все экземпляры будут существовать в одной и той же нити и будут совместно использовать статические ресурсы.

Документация по функциям-членам

QAxFactory::QAxFactory(const QUuid &libid, const QUuid &appid)

Создает объект QAxFactory, который возвращает libid и appid в реализации соответствующих функций интерфейса.

[override virtual] QAxFactory::~QAxFactory()

Уничтожает объект QAxFactory.

[virtual] QUuid QAxFactory::appID() const

Переопределите эту функцию, чтобы вернуть идентификатор приложения сервера ActiveX.

[virtual] QUuid QAxFactory::classID(const QString &key) const

Переопределите эту функцию, чтобы вернуть идентификатор класса для каждого key, возвращенного реализацией featureList(), или пустой QUuid, если эта фабрика не поддерживает значение key.

Реализация по умолчанию интерпретирует key как имя класса и возвращает значение записи Q_CLASSINFO() «ClassID».

[pure virtual] QObject *QAxFactory::createObject(const QString &key)

Переопределите эту функцию, чтобы вернуть новый объект для key, или 0, если эта фабрика не поддерживает значение key.

Если возвращаемый объект является QWidget, он будет экспонирован как ActiveX-контроль, в противном случае возвращаемый объект будет экспонирован как простой объект COM.

[virtual] bool QAxFactory::createObjectWrapper(QObject *object, IDispatch **wrapper)

Переопределите эту функцию, чтобы предоставить COM-объект для object в wrapper. Верните true, если функция выполнилась успешно; в противном случае верните false.

По умолчанию реализация создаёт оболочку автоматизации общего назначения на основе метаобъектной информации object.

[virtual] QUuid QAxFactory::eventsID(const QString &key) const

Переопределите эту функцию, чтобы вернуть идентификатор интерфейса событий для каждого key, возвращаемого реализацией featureList(), или пустой QUuid, если этот фабрика не поддерживает значение key.

По умолчанию реализация интерпретирует key как имя класса и возвращает значение записи Q_CLASSINFO() "EventsID".

[virtual] QString QAxFactory::exposeToSuperClass(const QString &key) const

Переопределите эту функцию, чтобы вернуть имя суперкласса key, до которого методы и свойства должны быть экспонированы ActiveX-контролем.

По умолчанию реализация интерпретирует key как имя класса и возвращает значение записи Q_CLASSINFO() "ToSuperClass". Если такое значение не задано, возвращается пустая строка, и функции и свойства всех суперклассов, включая QWidget, будут экспонированы.

Чтобы экспонировать только функции и свойства самого класса, переопределите эту функцию, чтобы вернуть key.

[pure virtual] QStringList QAxFactory::featureList() const

Переопределите эту функцию, чтобы вернуть список виджетов (имён классов), поддерживаемых этим фабрикой.

[virtual] bool QAxFactory::hasStockEvents(const QString &key) const

Переопределите эту функцию, чтобы вернуть true, если ActiveX-контроль key должен поддерживать стандартные ActiveX-события

  • Click
  • DblClick
  • KeyDown
  • KeyPress
  • KeyUp
  • MouseDown
  • MouseUp
  • MouseMove

По умолчанию реализация интерпретирует key как имя класса и возвращает true, если значение записи Q_CLASSINFO() "StockEvents" равно "yes". В противном случае функция возвращает false.

[virtual] QUuid QAxFactory::interfaceID(const QString &key) const

Переопределите эту функцию, чтобы вернуть идентификатор интерфейса для каждого key, возвращаемого реализацией featureList(), или пустой QUuid, если этот фабрика не поддерживает значение key.

По умолчанию реализация интерпретирует key как имя класса и возвращает значение записи Q_CLASSINFO() "InterfaceID".

[static] bool QAxFactory::isServer()

Возвращает true, если приложение запущено (COM) как ActiveX-сервер, иначе возвращает false.

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    if (!QAxFactory::isServer()) {
        // initialize for stand-alone execution
    }
    return app.exec();
}

[virtual] bool QAxFactory::isService() const

Переопределите эту функцию, чтобы вернуть true, если сервер работает как постоянная служба (например, служба NT) и не должен завершаться даже когда все предоставленные объекты были освобождены.

По умолчанию реализация возвращает false.

[pure virtual] const QMetaObject *QAxFactory::metaObject(const QString &key) const

Переопределите эту функцию, чтобы вернуть QMetaObject, соответствующий key, или 0, если этот фабрика не поддерживает значение key.

[static] bool QAxFactory::registerActiveObject(QObject *object)

Регистрирует QObject object в COM как работающий объект и возвращает true, если регистрация прошла успешно, иначе возвращает false. Объект автоматически аннулируется при уничтожении.

Эта функция должна вызываться только в том случае, если приложение было запущено пользователем (т.е. не COM для ответа на запрос) и только для одного объекта, обычно для верхнего объекта иерархии объектов приложения.

Эта функция ничего не делает и возвращает false, если информация о классе объекта для "RegisterObject" не установлена в "yes", или если сервер является сервером внутри процесса.

[virtual] void QAxFactory::registerClass(const QString &key, QSettings *settings) const

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

settings->setValue("/CLSID/" + classID(key)
                   + "/Implemented Categories/"
                   + "/{00000000-0000-0000-000000000000}/.",
                   QString());

Если вы переопределяете эту функцию, вы также должны переопределить unregisterClass() для удаления дополнительных значений реестра.

См. также QSettings.

[static] QString QAxFactory::serverDirPath()

Возвращает директорию, содержащую двоичный файл сервера.

Для серверов вне процесса это то же самое, что и QCoreApplication::applicationDirPath(). Для серверов внутри процесса эта функция возвращает директорию, содержащую приложение-хост.

[static] QString QAxFactory::serverFilePath()

Возвращает путь к файлу двоичного файла сервера.

Для серверов вне процесса это то же самое, что и QCoreApplication::applicationFilePath(). Для серверов внутри процесса эта функция возвращает путь к файлу приложения-хоста.

[static] bool QAxFactory::startServer(QAxFactory::ServerType type = MultipleInstances)

Запускает COM-сервер с type и возвращает true, если успешно, иначе возвращает false.

Вызов этой функции, если сервер уже запущен (или для сервера внутри процесса), ничего не делает и возвращает true.

Сервер запускается автоматически с type, установленным в MultipleInstances , если исполняемый файл сервера был запущен с параметром командной строки -activex. Чтобы переключиться на SingleInstance, вызовите

if (QAxFactory::isServer()) {
    QAxFactory::stopServer();
    QAxFactory::startServer(QAxFactory::SingleInstance);
}

в вашей собственной функции main().

[virtual] bool QAxFactory::stayTopLevel(const QString &key) const

Переопределите эту функцию, чтобы вернуть true, если ActiveX-контроль key должен быть главным окном, например, диалоговым окном. По умолчанию реализация возвращает false.

[static] bool QAxFactory::stopServer()

Останавливает COM-сервер и возвращает true, если успешно, иначе возвращает false.

Вызов этой функции, если сервер не запущен (или для сервера внутри процесса), ничего не делает и возвращает true.

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

Сервер останавливается автоматически при возвращении функции main().

[virtual] QUuid QAxFactory::typeLibID() const

Переопределите эту функцию, чтобы вернуть идентификатор библиотеки типов ActiveX-сервера.

[virtual] void QAxFactory::unregisterClass(const QString &key, QSettings *settings) const

Удаляет любые дополнительные значения для класса key из системного реестра с помощью объекта settings.

settings->remove("/CLSID/" + classID(key)
                 + "/Implemented Categories"
                 + "/{00000000-0000-0000-000000000000}/.");

См. также registerClass() и QSettings.

[virtual] bool QAxFactory::validateLicenseKey(const QString &key, const QString &licenseKey) const

Переопределите эту функцию, чтобы вернуть true, если licenseKey — это действительная лицензия для класса key, или если текущая машина лицензирована.

По умолчанию реализация возвращает true, если класс key не лицензирован (т.е. нет атрибута Q_CLASSINFO() "LicenseKey"), или если licenseKey совпадает со значением атрибута "LicenseKey", или если машина лицензирована через файл .LIC с тем же именем файла, что и этот COM-сервер.

Документация макросов

QAXCLASS(Класс)

Этот макрос добавляет создаваемый класс COM Класс в QAxFactory, объявленный с помощью макроса QAXFACTORY_BEGIN().

См. также QAXFACTORY_BEGIN(), QAXTYPE(), QAXFACTORY_END() и Q_CLASSINFO().

QAXFACTORY_BEGIN(IDTypeLib, IDApp)

Этот макрос может быть использован для экспорта нескольких классов QObject через неявно объявленную реализацию QAxFactory. Все классы QObject должны объявлять ClassID, InterfaceID и EventsID (если применимо) с помощью макроса Q_CLASSINFO(). Все объявления будут находиться в библиотеке типов с идентификатором IDTypeLib, а если сервер является исполняемым сервером, то он будет иметь идентификатор приложения IDApp.

Этот макрос необходимо использовать вместе с макросами QAXCLASS(), QAXTYPE() и QAXFACTORY_END().

QAXFACTORY_BEGIN(
    "{01234567-89AB-CDEF-0123-456789ABCDEF}", // type library ID
    "{01234567-89AB-CDEF-0123-456789ABCDEF}"  // application ID
)
    QAXCLASS(Class1)
    QAXCLASS(Class2)
QAXFACTORY_END()

QAXFACTORY_END

Завершает объявление QAxFactory, начатое макросом QAXFACTORY_BEGIN().

См. также QAXFACTORY_BEGIN(), QAXCLASS() и QAXTYPE().

QAXFACTORY_EXPORT(Класс, LibID, AppID)

Этот макрос может быть использован для экспорта реализации QAxFactory Класс из сервера COM. Все объявления будут находиться в библиотеке типов с идентификатором LibID, а если сервер является исполняемым сервером, то он будет иметь идентификатор приложения AppID.

QAXFACTORY_EXPORT(
    MyFactory,                                // factory class
    "{01234567-89AB-CDEF-0123-456789ABCDEF}", // type library ID
    "{01234567-89AB-CDEF-0123-456789ABCDEF}"  // application ID
)

См. также QAXFACTORY_BEGIN().

QAXTYPE(Класс)

Этот макрос добавляет несоздаваемый класс COM Класс в QAxFactory, объявленный с помощью макроса QAXFACTORY_BEGIN(). Класс Класс может использоваться в API других классов COM, экспортированных через QAXTYPE() или QAXCLASS().

Экземпляры типа Класс могут быть получены только с помощью API уже инициализированных объектов.

См. также QAXFACTORY_BEGIN(), QAXCLASS(), QAXFACTORY_END() и Q_CLASSINFO().

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.15/qaxfactory.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API