Auf dieser Seite

QAxFactory Class

Die Klasse „QAxFactory“ definiert eine Factory zur Erstellung von COM-Komponenten. Mehr...

Header: #include <qaxfactory.h>
CMake: find_package(Qt6 REQUIRED COMPONENTS AxServer)
target_link_libraries(mytarget PRIVATE Qt6::AxServer)
qmake: QT += axserver
Erbt von: QObject

Öffentliche Typen

enum ServerType { SingleInstance, MultipleInstances }

Öffentliche Funktionen

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

Statische öffentliche Mitglieder

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

Makros

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

Ausführliche Beschreibung

Implementieren Sie diese Factory einmalig in Ihrem COM-Server, um Informationen über die Komponenten bereitzustellen, die der Server erstellen kann. Erstellen Sie eine Unterklasse von QAxFactory, implementieren Sie die rein virtuellen Funktionen in einer beliebigen Implementierungsdatei (z. B. main.cpp) und exportieren Sie die Factory mithilfe des Makros „ 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
)

Wenn Sie das Makro „ Q_CLASSINFO() “ verwenden, um eindeutige Kennungen oder andere Attribute für Ihre Klasse bereitzustellen, können Sie die Makros „ QAXFACTORY_BEGIN() “, „ QAXCLASS() “ und „ QAXFACTORY_END() “ nutzen, um eine oder mehrere Klassen als COM-Objekte verfügbar zu machen.

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

Von einer ActiveX-Serveranwendung darf nur eine „QAxFactory“-Implementierung instanziiert und exportiert werden. Auf diese Instanz kann über die globale Funktion „qAxFactory()“ zugegriffen werden.

Eine Factory kann außerdem die Funktionen ` registerClass()` und ` unregisterClass()` neu implementieren, um zusätzliche Flags für ein ActiveX-Steuerelement in der Registrierung festzulegen. Um die Anzahl der Methoden oder Eigenschaften zu begrenzen, die eine Widget-Klasse aus ihren übergeordneten Klassen bereitstellt, implementieren Sie ` exposeToSuperClass()` neu.

Siehe auch „ QAxAggregated “, „ QAxBindable “ und „ActiveQt Framework“.

Dokumentation zu Mitgliedstypen

enum QAxFactory::ServerType

Diese Enumeration legt die verschiedenen Servertypen fest, die mit dem Befehl „ startServer “ gestartet werden können.

KonstanteWertBeschreibung
QAxFactory::SingleInstance0Der Serverprozess kann von jeder exportierten Klasse nur eine Instanz erstellen. COM startet für jede Anfrage einen neuen Prozess. Dies wird typischerweise bei Servern verwendet, die nur eine erstellbare Klasse exportieren.
QAxFactory::MultipleInstances1Der Server kann mehrere Instanzen jeder exportierten Klasse erstellen. Dies ist die Standardeinstellung. Alle Instanzen laufen im selben Thread und teilen sich statische Ressourcen.

Dokumentation zu Mitgliedsfunktionen

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

Erstellt ein QAxFactory-Objekt, das bei der Implementierung der jeweiligen Schnittstellenfunktionen die Werte „ libid “ und „ appid “ zurückgibt.

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

Löscht das „ QAxFactory “-Objekt.

[virtual] QUuid QAxFactory::appID() const

Implementieren Sie diese Funktion neu, damit sie die Anwendungs-ID des ActiveX-Servers zurückgibt.

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

Implementieren Sie diese Funktion neu, sodass sie für jedes von der Implementierung von ` featureList()` zurückgegebene ` key ` die Klassenkennung zurückgibt – oder ein leeres ` QUuid `, falls diese Factory den Wert ` key` nicht unterstützt.

Die Standardimplementierung interpretiert ` key ` als Klassennamen und gibt den Wert des Eintrags „ClassID“ aus ` Q_CLASSINFO()` zurück.

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

Implementieren Sie diese Funktion neu, sodass sie ein neues Objekt für „ key “ zurückgibt oder 0, falls diese Factory den Wert „ key “ nicht unterstützt.

Wenn das zurückgegebene Objekt ein ` QWidget ` ist, wird es als ActiveX-Steuerelement bereitgestellt; andernfalls wird das zurückgegebene Objekt als einfaches COM-Objekt bereitgestellt.

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

Implementieren Sie diese Funktion neu, um das COM-Objekt für „ object “ in „ wrapper “ bereitzustellen. Geben Sie „true“ zurück, wenn die Funktion erfolgreich war; andernfalls geben Sie „false“ zurück.

Die Standardimplementierung erstellt einen generischen Automation-Wrapper auf der Grundlage der Metaobjektinformationen von object.

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

Implementieren Sie diese Funktion neu, sodass sie für jedes von der Implementierung von featureList() zurückgegebene key die Kennung der Ereignisschnittstelle zurückgibt – oder ein leeres QUuid, falls diese Factory den Wert von key nicht unterstützt.

Die Standardimplementierung interpretiert ` key ` als Klassennamen und gibt den Wert des Eintrags „EventsID“ aus ` Q_CLASSINFO()` zurück.

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

Implementieren Sie diese Funktion neu, um den Namen der Oberklasse von ` key ` zurückzugeben, bis zu der Methoden und Eigenschaften vom ActiveX-Steuerelement bereitgestellt werden sollen.

Die Standardimplementierung interpretiert „ key “ als Klassennamen und gibt den Wert des Eintrags „ToSuperClass“ aus der „ Q_CLASSINFO() “ zurück. Ist kein solcher Wert gesetzt, wird die Null-Zeichenkette zurückgegeben, und die Funktionen und Eigenschaften aller Oberklassen einschließlich „ QWidget “ werden freigegeben.

Um nur die Funktionen und Eigenschaften der Klasse selbst verfügbar zu machen, implementieren Sie diese Funktion neu, sodass sie ` key` zurückgibt.

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

Implementieren Sie diese Funktion neu, sodass sie eine Liste der von dieser Factory unterstützten Widgets (Klassennamen) zurückgibt.

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

Implementieren Sie diese Funktion neu, sodass sie „true“ zurückgibt, wenn das ActiveX-Steuerelement „ key “ die Standard-ActiveX-Ereignisse unterstützen soll

  • Click
  • DblClick
  • KeyDown
  • KeyPress
  • KeyUp
  • Maus-Taste gedrückt
  • Maus loslassen
  • MouseMove

Die Standardimplementierung interpretiert „ key “ als Klassennamen und gibt „true“ zurück, wenn der Wert des Eintrags „StockEvents“ unter „ Q_CLASSINFO() “ auf „yes“ gesetzt ist. Andernfalls gibt diese Funktion „false“ zurück.

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

Implementieren Sie diese Funktion neu, sodass sie für jedes von der Implementierung von ` featureList()` zurückgegebene ` key ` die Schnittstellenkennung zurückgibt – oder ein leeres ` QUuid `, falls diese Factory den Wert von ` key` nicht unterstützt.

Die Standardimplementierung interpretiert ` key ` als Klassennamen und gibt den Wert des Eintrags „InterfaceID“ aus ` Q_CLASSINFO()` zurück.

[static] bool QAxFactory::isServer()

Gibt „true“ zurück, wenn die Anwendung (von COM) als ActiveX-Server gestartet wurde; andernfalls wird „false“ zurückgegeben.

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

Implementieren Sie diese Funktion neu, sodass sie „true“ zurückgibt, wenn der Server als persistenter Dienst (z. B. ein NT-Dienst) ausgeführt wird und auch dann nicht beendet werden soll, wenn alle bereitgestellten Objekte freigegeben wurden.

Die Standardimplementierung gibt „false“ zurück.

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

Implementieren Sie diese Funktion neu, sodass sie die „ QMetaObject “ zurückgibt, die dem Wert „ key “ entspricht, oder den Wert 0, falls diese Factory den Wert „ key “ nicht unterstützt.

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

Registriert das Objekt „ QObject “ object bei COM als laufendes Objekt und gibt „true“ zurück, wenn die Registrierung erfolgreich war; andernfalls wird „false“ zurückgegeben. Das Objekt wird automatisch deregistriert, wenn es zerstört wird.

Diese Funktion sollte nur aufgerufen werden, wenn die Anwendung vom Benutzer gestartet wurde (d. h. nicht von COM als Reaktion auf eine Anfrage), und nur für ein einziges Objekt, in der Regel das oberste Objekt der Objekthierarchie der Anwendung.

Diese Funktion führt keine Aktion aus und gibt „false“ zurück, wenn die Klasseninformation des Objekts für „RegisterObject“ nicht auf „yes“ gesetzt ist oder wenn es sich bei dem Server um einen In-Process-Server handelt.

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

Registriert zusätzliche Werte für die Klasse „ key “ in der Systemregistrierung mithilfe des Objekts „ settings “. Die Standardwerte wurden bereits vom Framework registriert, doch zusätzliche Werte, z. B. implementierte Kategorien, können in einer Implementierung dieser Funktion hinzugefügt werden.

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

Wenn Sie diese Funktion neu implementieren, müssen Sie auch ` unregisterClass()` neu implementieren, um die zusätzlichen Registrierungswerte zu entfernen.

Siehe auch QSettings.

[static] QString QAxFactory::serverDirPath()

Gibt das Verzeichnis zurück, in dem sich die Server-Binärdatei befindet.

Bei Out-of-Process-Servern entspricht dies der Funktion „ QCoreApplication::applicationDirPath()“. Bei In-Process-Servern gibt diese Funktion das Verzeichnis zurück, in dem sich die Host-Anwendung befindet.

[static] QString QAxFactory::serverFilePath()

Gibt den Dateipfad der Server-Binärdatei zurück.

Bei Out-of-Process-Servern entspricht dies der Funktion ` QCoreApplication::applicationFilePath()`. Bei In-Process-Servern gibt diese Funktion den Dateipfad der hostenden Anwendung zurück.

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

Startet den COM-Server mit „ type “ und gibt bei Erfolg „true“ zurück, andernfalls „false“.

Wird diese Funktion aufgerufen, während der Server bereits läuft (oder bei einem In-Process-Server), hat dies keine Auswirkung und es wird „true“ zurückgegeben.

Der Server wird automatisch mit der Einstellung „ type “ auf „ MultipleInstances “ gestartet, wenn die ausführbare Serverdatei mit dem Befehlszeilenparameter „ -activex “ gestartet wurde. Um zu „ SingleInstance “ zu wechseln, rufen Sie

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

in Ihrer eigenen Einstiegsfunktion `main()`.

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

Implementieren Sie diese Funktion neu, sodass sie „true“ zurückgibt, wenn das ActiveX-Steuerelement „ key “ ein Fenster der obersten Ebene sein soll, z. B. ein Dialogfeld. Die Standardimplementierung gibt „false“ zurück.

[static] bool QAxFactory::stopServer()

Beendet den COM-Server und gibt bei Erfolg „true“ zurück, andernfalls „false“.

Wird diese Funktion aufgerufen, während der Server nicht läuft (oder bei einem In-Process-Server), hat dies keine Auswirkung und es wird „true“ zurückgegeben.

Das Beenden des Servers macht vorhandene Objekte nicht ungültig, es können jedoch keine neuen Objekte aus dem bestehenden Serverprozess heraus erstellt werden. Normalerweise startet COM einen neuen Serverprozess, wenn zusätzliche Objekte angefordert werden.

Der Server wird automatisch gestoppt, wenn die Funktion `main()` zurückkehrt.

[virtual] QUuid QAxFactory::typeLibID() const

Implementieren Sie diese Funktion neu, damit sie die Typbibliotheks-ID des ActiveX-Servers zurückgibt.

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

Hebt die Registrierung aller zusätzlichen Werte für die Klasse „ key “ in der Systemregistrierung mithilfe des Objekts „ settings “ auf.

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

Siehe auch „ registerClass()“ und „ QSettings “.

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

Implementieren Sie diese Funktion neu, sodass sie „true“ zurückgibt, wenn „ licenseKey “ eine gültige Lizenz für die Klasse „ key “ ist oder wenn der aktuelle Rechner lizenziert ist.

Die Standardimplementierung gibt „true“ zurück, wenn die Klasse ` key ` nicht lizenziert ist (d. h. kein ` Q_CLASSINFO() `-Attribut „LicenseKey“ vorhanden ist), wenn ` licenseKey ` mit dem Wert des Attributs „LicenseKey“ übereinstimmt oder wenn der Rechner über eine `.LIC`-Datei mit demselben Dateinamen wie dieser COM-Server lizenziert ist.

Makro-Dokumentation

QAXCLASS(Class)

Dieses Makro fügt dem mit dem Makro „ QAXFACTORY_BEGIN()“ deklarierten „ QAxFactory “ eine erstellbare COM-Klasse „ Class “ hinzu.

Siehe auch „ QAXFACTORY_BEGIN()“, „ QAXTYPE()“, „ QAXFACTORY_END()“ und „ Q_CLASSINFO()“.

QAXFACTORY_BEGIN(IDTypeLib, IDApp)

Dieses Makro kann verwendet werden, um mehrere „ QObject “-Klassen über eine implizit deklarierte „ QAxFactory “-Implementierung zu exportieren. Alle „ QObject “-Klassen müssen die ClassID, InterfaceID und EventsID (falls zutreffend) über das Makro „ Q_CLASSINFO()“ deklarieren. Alle Deklarationen befinden sich in einer Typbibliothek mit der ID „ IDTypeLib “, und wenn es sich bei dem Server um einen ausführbaren Server handelt, hat dieser die Anwendungs-ID „ IDApp “.

Dieses Makro muss zusammen mit den Makros „ QAXCLASS()“, „ QAXTYPE()“ und „ QAXFACTORY_END()“ verwendet werden.

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()

Vervollständigt die mit dem Makro „ QAXFACTORY_BEGIN()“ begonnene Deklaration „ QAxFactory “.

Siehe auch „ QAXFACTORY_BEGIN()“, „ QAXCLASS()“ und „ QAXTYPE()“.

QAXFACTORY_EXPORT(Class, LibID, AppID)

Mit diesem Makro kann eine QAxFactory -Implementierung Class von einem COM-Server exportiert werden. Alle Deklarationen befinden sich in einer Typbibliothek mit der ID LibID; handelt es sich bei dem Server um einen ausführbaren Server, so hat er die Anwendungs-ID AppID.

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

Siehe auch QAXFACTORY_BEGIN().

QAXTYPE(Class)

Dieses Makro fügt dem mit ` QAXFACTORY_BEGIN()` deklarierten ` QAxFactory ` eine nicht erstellbare COM-Klasse ` Class ` hinzu. Die Klasse ` Class ` kann in APIs anderer COM-Klassen verwendet werden, die über `QAXTYPE()` oder ` QAXCLASS()` exportiert werden.

Instanzen vom Typ „ Class “ können nur über APIs bereits instanziierter Objekte abgerufen werden.

Siehe auch „ QAXFACTORY_BEGIN()“, „ QAXCLASS()“, „ QAXFACTORY_END()“ und „ 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.