Класс QAxFactory
Класс QAxFactory определяет фабрику для создания компонентов COM. Подробнее...
| Заголовок: | #include <QAxFactory> |
| qmake: | QT += axserver |
| Наследует: | QObject |
Типы публичного доступа
| перечисление | ServerType { SingleInstance, MultipleInstances } |
Функции публичного доступа
| QAxFactory(const QUuid &libid, const QUuid &appid) | |
| виртуальный | ~QAxFactory() override |
| виртуальный QUuid | appID() const |
| виртуальный QUuid | classID(const QString &key) const |
| виртуальный QObject * | createObject(const QString &key) = 0 |
| виртуальный bool | createObjectWrapper(QObject *object, IDispatch **wrapper) |
| виртуальный QUuid | eventsID(const QString &key) const |
| виртуальный QString | exposeToSuperClass(const QString &key) const |
| виртуальный QStringList | featureList() const = 0 |
| виртуальный bool | hasStockEvents(const QString &key) const |
| виртуальный QUuid | interfaceID(const QString &key) const |
| виртуальный bool | isService() const |
| виртуальный const QMetaObject * | metaObject(const QString &key) const = 0 |
| виртуальный void | registerClass(const QString &key, QSettings *settings) const |
| виртуальный bool | stayTopLevel(const QString &key) const |
| виртуальный QUuid | typeLibID() const |
| виртуальный void | unregisterClass(const QString &key, QSettings *settings) const |
| виртуальный 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(Class)
Этот макрос добавляет создаваемый класс COM Class в 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(Class, LibID, AppID)
Этот макрос может быть использован для экспорта реализации QAxFactory Class с 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(Class)
Этот макрос добавляет несоздаваемый COM-класс Class в QAxFactory, объявленный с помощью QAXFACTORY_BEGIN(). Класс Class может использоваться в API других COM-классов, экспортированных с помощью QAXTYPE() или QAXCLASS().
Экземпляры типа Class могут быть получены только с помощью 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.14/qaxfactory.html