En esta página

QAxFactory Class

La clase QAxFactory define una fábrica para la creación de componentes COM. Más...

Cabecera: #include <QAxFactory>
CMake: find_package(Qt6 REQUIRED COMPONENTS AxServer)
target_link_libraries(mytarget PRIVATE Qt6::AxServer)
qmake: QT += axserver
Hereda: QObject

Tipos Públicos

enum ServerType { SingleInstance, MultipleInstances }

Funciones Públicas

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

Miembros públicos estáticos

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

Macros

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

Descripción detallada

Implementa esta factoría una vez en tu servidor COM para proporcionar información sobre los componentes que el servidor puede crear. Subclase QAxFactory e implemente las funciones virtuales puras en cualquier archivo de implementación (por ejemplo, main.cpp), y exporte la fábrica utilizando la macro 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
)

Si utilizas la macro Q_CLASSINFO() para proporcionar los identificadores únicos u otros atributos para tu clase, puedes utilizar las macros QAXFACTORY_BEGIN(), QAXCLASS() y QAXFACTORY_END() para exponer una o más clases como objetos COM.

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

Una aplicación de servidor ActiveX sólo puede instanciar y exportar una implementación de QAxFactory. Esta instancia es accesible a través de la función global qAxFactory().

Una fábrica también puede reimplementar las funciones registerClass() y unregisterClass() para establecer indicadores adicionales para un control ActiveX en el registro. Para limitar el número de métodos o propiedades que una clase widget expone desde sus clases padre reimplemente exposeToSuperClass().

Véase también QAxAggregated, QAxBindable, y ActiveQt Framework.

Documentación de tipos de miembros

enum QAxFactory::ServerType

Este enum especifica los diferentes tipos de servidores que pueden iniciarse con startServer.

ConstanteValorDescripción
QAxFactory::SingleInstance0El proceso servidor sólo puede crear una instancia de cada clase exportada. COM inicia un nuevo proceso para cada petición. Esto se usa típicamente en servidores que exportan sólo una clase creable.
QAxFactory::MultipleInstances1El servidor puede crear múltiples instancias de cada clase exportada. Esta es la opción por defecto. Todas las instancias vivirán en el mismo hilo y compartirán recursos estáticos.

Documentación de las funciones miembro

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

Construye un objeto QAxFactory que devuelve libid y appid en la implementación de las respectivas funciones de interfaz.

[override virtual noexcept] QAxFactory::~QAxFactory()

Destruye el objeto QAxFactory.

[virtual] QUuid QAxFactory::appID() const

Reimplemente esta función para devolver el identificador de aplicación del servidor ActiveX.

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

Reimplemente esta función para devolver el identificador de clase para cada key devuelto por la implementación de featureList(), o un QUuid vacío si esta fábrica no soporta el valor de key.

La implementación por defecto interpreta key como el nombre de la clase, y devuelve el valor de la entrada "ClassID" de Q_CLASSINFO().

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

Reimplemente esta función para devolver un nuevo objeto para key, o 0 si esta fábrica no soporta el valor de key.

Si el objeto devuelto es un QWidget se expondrá como un control ActiveX, en caso contrario el objeto devuelto se expondrá como un simple objeto COM.

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

Reimplemente esta función para proporcionar el objeto COM para object en wrapper. Devuelve true si la función tuvo éxito; en caso contrario devuelve false.

La implementación predeterminada crea una envoltura de automatización genérica basada en la información del objeto meta de object.

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

Reimplemente esta función para devolver el identificador de la interfaz de eventos para cada key devuelto por la implementación de featureList(), o un QUuid vacío si esta fábrica no soporta el valor de key.

La implementación por defecto interpreta key como el nombre de la clase, y devuelve el valor de la entrada "EventsID" de Q_CLASSINFO().

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

Reimplemente esta función para devolver el nombre de la superclase de key hasta la cual los métodos y propiedades deben ser expuestos por el control ActiveX.

La implementación por defecto interpreta key como el nombre de la clase, y devuelve el valor de la entrada "ToSuperClass" de Q_CLASSINFO(). Si no se establece dicho valor, se devuelve la cadena nula, y se expondrán las funciones y propiedades de todas las superclases, incluida QWidget.

Para exponer únicamente las funciones y propiedades de la propia clase, reimplemente esta función para que devuelva key.

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

Reimplemente esta función para devolver una lista de los widgets (nombres de clase) soportados por esta fábrica.

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

Reimplemente esta función para que devuelva true si el control ActiveX key debe soportar los eventos ActiveX estándar

  • Clic
  • DblClick
  • TeclaAbajo
  • Pulsar tecla
  • TeclaUp
  • RatónAbajo
  • MouseUp
  • MouseMove

La implementación por defecto interpreta key como el nombre de la clase, y devuelve true si el valor de la entrada "StockEvents" de Q_CLASSINFO() es "yes". En caso contrario, esta función devuelve false.

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

Reimplemente esta función para devolver el identificador de interfaz de cada key devuelto por la implementación de featureList(), o un QUuid vacío si esta fábrica no admite el valor de key.

La implementación por defecto interpreta key como el nombre de la clase, y devuelve el valor de la entrada "InterfaceID" de Q_CLASSINFO().

[static] bool QAxFactory::isServer()

Devuelve true si la aplicación ha sido iniciada (por COM) como un servidor ActiveX, en caso contrario devuelve 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

Reimplemente esta función para que devuelva true si el servidor se está ejecutando como un servicio persistente (por ejemplo, un servicio NT) y no debe terminar incluso cuando todos los objetos proporcionados hayan sido liberados.

La implementación por defecto devuelve false.

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

Reimplemente esta función para devolver el QMetaObject correspondiente a key, o 0 si esta fábrica no admite el valor de key.

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

Registra el QObject object con COM como un objeto en ejecución, y devuelve true si el registro tuvo éxito, de lo contrario devuelve false. El objeto se desregistra automáticamente cuando se destruye.

Esta función sólo debe invocarse si la aplicación ha sido iniciada por el usuario (es decir, no por COM para responder a una petición), y sólo para un objeto, normalmente el objeto de nivel superior de la jerarquía de objetos de la aplicación.

Esta función no hace nada y devuelve false si la información de clase del objeto para "RegisterObject" no está establecida en "yes", o si el servidor es un servidor en proceso.

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

Registra valores adicionales para la clase key en el registro del sistema utilizando el objeto settings. Los valores estándar ya han sido registrados por el framework, pero se pueden añadir valores adicionales, por ejemplo, categorías implementadas, en una implementación de esta función.

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

Si reimplementa esta función también debe reimplementar unregisterClass() para eliminar los valores adicionales del registro.

Véase también QSettings.

[static] QString QAxFactory::serverDirPath()

Devuelve el directorio que contiene el binario del servidor.

Para servidores fuera de proceso es lo mismo que QCoreApplication::applicationDirPath(). Para servidores en proceso esta función devuelve el directorio que contiene la aplicación anfitriona.

[static] QString QAxFactory::serverFilePath()

Devuelve la ruta del archivo binario del servidor.

Para servidores fuera de proceso es lo mismo que QCoreApplication::applicationFilePath(). Para servidores en proceso esa función devuelve la ruta del archivo de la aplicación anfitriona.

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

Inicia el servidor COM con type y devuelve true si tiene éxito, en caso contrario devuelve false.

Llamar a esta función si el servidor ya se está ejecutando (o para un servidor en proceso) no hace nada y devuelve true.

El servidor se inicia automáticamente con type establecido en MultipleInstances si el ejecutable del servidor se ha iniciado con el parámetro de línea de comandos -activex. Para cambiar a SingleInstance, llame a

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

en su propia función de punto de entrada main().

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

Reimplemente esta función para que devuelva true si el control ActiveX key debe ser una ventana de nivel superior, por ejemplo, un diálogo. La implementación por defecto devuelve false.

[static] bool QAxFactory::stopServer()

Detiene el servidor COM y devuelve true si tiene éxito, en caso contrario devuelve false.

Llamar a esta función si el servidor no se está ejecutando (o para un servidor en proceso) no hace nada y devuelve true.

Detener el servidor no invalidará los objetos existentes, pero no se podrán crear nuevos objetos desde el proceso servidor existente. Normalmente COM iniciará un nuevo proceso servidor si se solicitan objetos adicionales.

El servidor se detiene automáticamente cuando vuelve la función main().

[virtual] QUuid QAxFactory::typeLibID() const

Reimplemente esta función para devolver el identificador de la biblioteca de tipos del servidor ActiveX.

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

Desregistra cualquier valor adicional para la clase key del registro del sistema utilizando el objeto settings.

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

Véase también registerClass() y QSettings.

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

Reimplemente esta función para que devuelva true si licenseKey es una licencia válida para la clase key, o si la máquina actual tiene licencia.

La implementación por defecto devuelve true si la clase key no tiene licencia (es decir, no hay atributo "LicenseKey" en Q_CLASSINFO() ), o si licenseKey coincide con el valor del atributo "LicenseKey", o si la máquina tiene licencia a través de un archivo .LIC con el mismo nombre de archivo que este servidor COM.

Documentación de macros

QAXCLASS(Class)

Esta macro añade una clase COM creable Class a la QAxFactory declarada con la macro QAXFACTORY_BEGIN().

Véase también QAXFACTORY_BEGIN(), QAXTYPE(), QAXFACTORY_END() y Q_CLASSINFO().

QAXFACTORY_BEGIN(IDTypeLib, IDApp)

Esta macro puede utilizarse para exportar múltiples clases QObject a través de una implementación QAxFactory declarada implícitamente. Todas las clases QObject tienen que declarar el ClassID, InterfaceID y EventsID (si es aplicable) a través de la macro Q_CLASSINFO(). Todas las declaraciones estarán en una biblioteca de tipos con el id IDTypeLib, y si el servidor es un servidor ejecutable entonces tendrá el id de aplicación IDApp.

Esta macro debe utilizarse junto con las macros QAXCLASS(), QAXTYPE() y 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()

Completa la declaración QAxFactory iniciada con la macro QAXFACTORY_BEGIN().

Véase también QAXFACTORY_BEGIN(), QAXCLASS() y QAXTYPE().

QAXFACTORY_EXPORT(Class, LibID, AppID)

Esta macro puede utilizarse para exportar una implementación QAxFactory Class desde un servidor COM. Todas las declaraciones estarán en una biblioteca de tipos con el id LibID, y si el servidor es un servidor ejecutable entonces tendrá el id de aplicación AppID.

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

Véase también QAXFACTORY_BEGIN().

QAXTYPE(Class)

Esta macro añade una clase COM no creable Class a la QAxFactory declarada con QAXFACTORY_BEGIN(). La clase Class puede utilizarse en APIs de otras clases COM exportadas mediante QAXTYPE() o QAXCLASS().

Las instancias del tipo Class sólo pueden recuperarse utilizando APIs de objetos ya instanciados.

Véase también QAXFACTORY_BEGIN(), QAXCLASS(), QAXFACTORY_END() y Q_CLASSINFO().

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.