QAxFactory Class
La classe QAxFactory définit une fabrique permettant la création de composants COM. En savoir plus...
| En-tête : | #include <qaxfactory.h> |
| CMake : | find_package(Qt6 REQUIRED COMPONENTS AxServer) target_link_libraries(mytarget PRIVATE Qt6::AxServer) |
| qmake : | QT += axserver |
| Hérite de : | QObject |
Types publics
| enum | ServerType { SingleInstance, MultipleInstances } |
Fonctions publiques
| 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 |
Membres publics statiques
| 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) |
Description détaillée
Implémentez cette fabrique une seule fois dans votre serveur COM afin de fournir des informations sur les composants que le serveur peut créer. Créez une sous-classe de QAxFactory et implémentez les fonctions virtuelles pures dans n'importe quel fichier d'implémentation (par exemple main.cpp), puis exportez la fabrique à l'aide de 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 vous utilisez la macro ` Q_CLASSINFO() ` pour fournir les identifiants uniques ou d'autres attributs à votre classe, vous pouvez utiliser les macros ` QAXFACTORY_BEGIN()`, ` QAXCLASS() ` et ` QAXFACTORY_END() ` pour exposer une ou plusieurs classes en tant qu'objets COM.
QAXFACTORY_BEGIN(
"{01234567-89AB-CDEF-0123-456789ABCDEF}", // type library ID
"{01234567-89AB-CDEF-0123-456789ABCDEF}" // application ID
)
QAXCLASS(Class1)
QAXCLASS(Class2)
QAXFACTORY_END()Une seule implémentation de QAxFactory peut être instanciée et exportée par une application serveur ActiveX. Cette instance est accessible via la fonction globale qAxFactory().
Une fabrique peut également réimplémenter les fonctions ` registerClass()` et ` unregisterClass()` pour définir des indicateurs supplémentaires pour un contrôle ActiveX dans le registre. Pour limiter le nombre de méthodes ou de propriétés qu’une classe de widget expose à partir de ses classes parentes, réimplémentez ` exposeToSuperClass()`.
Voir également QAxAggregated, QAxBindable et ActiveQt Framework.
Documentation sur les types de membres
enum QAxFactory::ServerType
Cette énumération spécifie les différents types de serveurs pouvant être lancés à l'aide de la commande « startServer ».
| Constante | Valeur | Description |
|---|---|---|
QAxFactory::SingleInstance | 0 | Le processus du serveur ne peut créer qu’une seule instance de chaque classe exportée. COM lance un nouveau processus pour chaque requête. Ce mode est généralement utilisé dans les serveurs qui n’exportent qu’une seule classe créable. |
QAxFactory::MultipleInstances | 1 | Le serveur peut créer plusieurs instances de chaque classe exportée. Il s'agit du comportement par défaut. Toutes les instances s'exécuteront dans le même thread et partageront les ressources statiques. |
Documentation des fonctions membres
QAxFactory::QAxFactory(const QUuid &libid, const QUuid &appid)
Crée un objet QAxFactory qui renvoie « libid » et « appid » lors de l'implémentation des fonctions respectives de l'interface.
[override virtual noexcept] QAxFactory::~QAxFactory()
Supprime l'objet « QAxFactory ».
[virtual] QUuid QAxFactory::appID() const
Réimplémentez cette fonction afin qu'elle renvoie l'identifiant d'application du serveur ActiveX.
[virtual] QUuid QAxFactory::classID(const QString &key) const
Réimplémentez cette fonction pour renvoyer l'identifiant de classe correspondant à chaque key renvoyé par l'implémentation de featureList(), ou un QUuid vide si cette fabrique ne prend pas en charge la valeur de key.
L'implémentation par défaut interprète key comme le nom de la classe et renvoie la valeur de l'entrée « ClassID » de Q_CLASSINFO().
[pure virtual] QObject *QAxFactory::createObject(const QString &key)
Réimplémentez cette fonction pour renvoyer un nouvel objet de type ` key`, ou 0 si cette fabrique ne prend pas en charge la valeur ` key`.
Si l'objet renvoyé est un ` QWidget `, il sera exposé en tant que contrôle ActiveX ; dans le cas contraire, l'objet renvoyé sera exposé en tant qu'objet COM simple.
[virtual] bool QAxFactory::createObjectWrapper(QObject *object, IDispatch **wrapper)
Réimplémentez cette fonction afin de fournir l'objet COM correspondant à object dans wrapper. Renvoyez « true » si la fonction s'est déroulée avec succès ; sinon, renvoyez « false ».
L'implémentation par défaut crée un wrapper d'automatisation générique basé sur les informations du méta-objet de object.
[virtual] QUuid QAxFactory::eventsID(const QString &key) const
Réimplémentez cette fonction pour renvoyer l'identifiant de l'interface d'événement pour chaque key renvoyé par l'implémentation de featureList(), ou une QUuid vide si cette fabrique ne prend pas en charge la valeur de key.
L'implémentation par défaut interprète key comme le nom de la classe et renvoie la valeur de l'entrée « EventsID » de Q_CLASSINFO().
[virtual] QString QAxFactory::exposeToSuperClass(const QString &key) const
Réimplémentez cette fonction pour renvoyer le nom de la superclasse de ` key ` jusqu'à laquelle les méthodes et les propriétés doivent être exposées par le contrôle ActiveX.
L'implémentation par défaut interprète key comme le nom de la classe et renvoie la valeur de l'entrée « ToSuperClass » de la base de données Q_CLASSINFO(). Si aucune valeur n'est définie, une chaîne vide est renvoyée et les fonctions et propriétés de toutes les superclasses, y compris QWidget, seront exposées.
Pour n’exposer que les fonctions et propriétés de la classe elle-même, réimplémentez cette fonction afin qu’elle renvoie key.
[pure virtual] QStringList QAxFactory::featureList() const
Réimplémentez cette fonction pour qu'elle renvoie une liste des widgets (noms de classes) pris en charge par cette fabrique.
[virtual] bool QAxFactory::hasStockEvents(const QString &key) const
Réimplémentez cette fonction pour qu'elle renvoie « true » si le contrôle ActiveX key doit prendre en charge les événements ActiveX standard
- Click
- DblClick
- KeyDown
- KeyPress
- KeyUp
- Clic de souris
- MouseUp
- MouseMove
L'implémentation par défaut interprète key comme le nom de la classe et renvoie true si la valeur de l'entrée « StockEvents » du fichier Q_CLASSINFO() est « yes ». Dans le cas contraire, cette fonction renvoie false.
[virtual] QUuid QAxFactory::interfaceID(const QString &key) const
Réimplémentez cette fonction afin qu’elle renvoie l’identifiant d’interface correspondant à chaque key renvoyé par l’implémentation de featureList(), ou un QUuid vide si cette fabrique ne prend pas en charge la valeur de key.
L'implémentation par défaut interprète key comme le nom de la classe et renvoie la valeur de l'entrée « InterfaceID » de la fonction Q_CLASSINFO().
[static] bool QAxFactory::isServer()
Renvoie « true » si l'application a été lancée (par COM) en tant que serveur ActiveX ; sinon, renvoie « 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
Réimplémentez cette fonction pour qu'elle renvoie « true » si le serveur s'exécute en tant que service persistant (par exemple, un service NT) et ne doit pas s'arrêter même lorsque tous les objets fournis ont été libérés.
L'implémentation par défaut renvoie « false ».
[pure virtual] const QMetaObject *QAxFactory::metaObject(const QString &key) const
Réimplémentez cette fonction pour qu'elle renvoie l'QMetaObject correspondant à key, ou 0 si cette fabrique ne prend pas en charge la valeur de key.
[static] bool QAxFactory::registerActiveObject(QObject *object)
Enregistre l'QObject e object auprès de COM en tant qu'objet actif, et renvoie « true » si l'enregistrement a réussi, sinon « false ». L'objet est automatiquement désenregistré lorsqu'il est détruit.
Cette fonction ne doit être appelée que si l’application a été lancée par l’utilisateur (c’est-à-dire non pas par COM en réponse à une requête), et uniquement pour un seul objet, généralement l’objet de niveau supérieur de la hiérarchie d’objets de l’application.
Cette fonction ne fait rien et renvoie « false » si l’information de classe de l’objet pour « RegisterObject » n’est pas définie sur « yes », ou si le serveur est un serveur en cours de traitement.
[virtual] void QAxFactory::registerClass(const QString &key, QSettings *settings) const
Enregistre des valeurs supplémentaires pour la classe ` key ` dans le registre système à l'aide de l'objet ` settings `. Les valeurs par défaut ont déjà été enregistrées par le framework, mais des valeurs supplémentaires, par exemple des catégories implémentées, peuvent être ajoutées dans une implémentation de cette fonction.
settings->setValue("/CLSID/" + classID(key)
+ "/Implemented Categories/"
+ "/{00000000-0000-0000-000000000000}/.",
QString());Si vous réimplémentez cette fonction, vous devez également réimplémenter unregisterClass() afin de supprimer les valeurs supplémentaires du registre.
Voir également QSettings.
[static] QString QAxFactory::serverDirPath()
Renvoie le répertoire contenant le binaire du serveur.
Pour les serveurs hors processus, cela revient à appeler la fonction ` QCoreApplication::applicationDirPath()`. Pour les serveurs en processus, cette fonction renvoie le répertoire contenant l'application hôte.
[static] QString QAxFactory::serverFilePath()
Renvoie le chemin d'accès au fichier binaire du serveur.
Pour les serveurs hors processus, cela revient à appeler la fonction ` QCoreApplication::applicationFilePath()`. Pour les serveurs en processus, cette fonction renvoie le chemin d'accès au fichier de l'application hôte.
[static] bool QAxFactory::startServer(QAxFactory::ServerType type = MultipleInstances)
Lance le serveur COM à l'adresse type et renvoie « true » en cas de succès, sinon « false ».
L'appel de cette fonction alors que le serveur est déjà en cours d'exécution (ou pour un serveur en cours de traitement) n'a aucun effet et renvoie « true ».
Le serveur est lancé automatiquement avec type défini sur MultipleInstances si l'exécutable du serveur a été lancé avec le paramètre de ligne de commande -activex. Pour passer à SingleInstance, appelez
if (QAxFactory::isServer()) {
QAxFactory::stopServer();
QAxFactory::startServer(QAxFactory::SingleInstance);
}dans votre propre fonction d’entrée `main()`.
[virtual] bool QAxFactory::stayTopLevel(const QString &key) const
Réimplémentez cette fonction pour qu'elle renvoie « true » si le contrôle ActiveX key doit être une fenêtre de premier niveau, par exemple une boîte de dialogue. L'implémentation par défaut renvoie « false ».
[static] bool QAxFactory::stopServer()
Arrête le serveur COM et renvoie « true » en cas de réussite, sinon « false ».
L'appel de cette fonction alors que le serveur n'est pas en cours d'exécution (ou dans le cas d'un serveur en cours de traitement) n'a aucun effet et renvoie « true ».
L'arrêt du serveur n'invalide pas les objets existants, mais aucun nouvel objet ne peut être créé à partir du processus serveur existant. En général, COM lance un nouveau processus serveur si des objets supplémentaires sont demandés.
Le serveur est arrêté automatiquement lorsque la fonction main() se termine.
[virtual] QUuid QAxFactory::typeLibID() const
Réimplémentez cette fonction afin qu'elle renvoie l'identifiant de la bibliothèque de types du serveur ActiveX.
[virtual] void QAxFactory::unregisterClass(const QString &key, QSettings *settings) const
Supprime toutes les entrées supplémentaires associées à la classe « key » du registre système à l'aide de l'objet « settings ».
settings->remove("/CLSID/" + classID(key)
+ "/Implemented Categories"
+ "/{00000000-0000-0000-000000000000}/.");Voir également registerClass() et QSettings.
[virtual] bool QAxFactory::validateLicenseKey(const QString &key, const QString &licenseKey) const
Réimplémentez cette fonction pour qu'elle renvoie `true` si ` licenseKey ` est une licence valide pour la classe ` key`, ou si la machine actuelle dispose d'une licence.
L'implémentation par défaut renvoie « true » si la classe key n'est pas sous licence (c'est-à-dire si elle ne possède pas d'attribut « LicenseKey » de type Q_CLASSINFO() ), ou si licenseKey correspond à la valeur de l'attribut « LicenseKey », ou encore si la machine est sous licence via un fichier .LIC portant le même nom que ce serveur COM.
Documentation des macros
QAXCLASS(Class)
Cette macro ajoute une classe COM créable Class à l'QAxFactory déclarée à l'aide de la macro QAXFACTORY_BEGIN().
Voir également QAXFACTORY_BEGIN(), QAXTYPE(), QAXFACTORY_END() et Q_CLASSINFO().
QAXFACTORY_BEGIN(IDTypeLib, IDApp)
Cette macro permet d’exporter plusieurs classes « QObject » via une implémentation « QAxFactory » déclarée implicitement. Toutes les classes « QObject » doivent déclarer les identifiants ClassID, InterfaceID et EventsID (le cas échéant) à l’aide de la macro « Q_CLASSINFO() ». Toutes les déclarations figureront dans une bibliothèque de types portant l’identifiant « IDTypeLib » ; si le serveur est un serveur exécutable, il portera l’identifiant d’application « IDApp ».
Cette macro doit être utilisée conjointement avec les macros QAXCLASS(), QAXTYPE() et 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()
Complète la déclaration « QAxFactory » amorcée par la macro « QAXFACTORY_BEGIN() ».
Voir également QAXFACTORY_BEGIN(), QAXCLASS() et QAXTYPE().
QAXFACTORY_EXPORT(Class, LibID, AppID)
Cette macro permet d'exporter une implémentation de l'interface QAxFactory Class à partir d'un serveur COM. Toutes les déclarations figureront dans une bibliothèque de types portant l'identifiant LibID; si le serveur est un serveur exécutable, il portera l'identifiant d'application AppID.
QAXFACTORY_EXPORT(
MyFactory, // factory class
"{01234567-89AB-CDEF-0123-456789ABCDEF}", // type library ID
"{01234567-89AB-CDEF-0123-456789ABCDEF}" // application ID
)Voir également QAXFACTORY_BEGIN().
QAXTYPE(Class)
Cette macro ajoute une classe COM non créable, Class, à l'QAxFactory déclarée à l'aide de la fonction QAXFACTORY_BEGIN(). La classe Class peut être utilisée dans les API d'autres classes COM exportées via QAXTYPE() ou QAXCLASS().
Les instances de type Class ne peuvent être récupérées qu’à l’aide des API d’objets déjà instanciés.
Voir également QAXFACTORY_BEGIN(), QAXCLASS(), QAXFACTORY_END() et 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.