Verwendung von ActiveX-Steuerelementen und COM in Qt
Das Modul „ QAxContainer “ ist Teil des ActiveQt-Frameworks. Es stellt eine Bibliothek bereit, die eine Unterklasse von „ QWidget “ ( QAxWidget) implementiert, die als Container für ActiveX-Steuerelemente dient, sowie eine Unterklasse von „ QObject “ ( QAxObject), mit der sich auf einfache Weise auf nicht-visuelle COM-Objekte zugreifen lässt. Das Skripten von COM-Objekten, die mithilfe dieser Klassen eingebettet wurden, ist über die Klassen „ QAxScript “ ( QAxScriptManager ) und „ QAxScriptEngine “ ( ) möglich, und eine Reihe von Tools erleichtert den programmgesteuerten Zugriff auf COM-Objekte.
Das Modul besteht aus sechs Klassen
- QAxBase ist eine abstrakte Klasse, die eine API zum Initialisieren und Zugreifen auf ein COM-Objekt oder ein ActiveX-Steuerelement bereitstellt.
- QAxObject stellt eine „ QObject “ bereit, die ein COM-Objekt umhüllt.
- QAxWidget ist ein „ QWidget “, das ein ActiveX-Steuerelement umhüllt.
- QAxScriptManager, „ QAxScript “ und „ QAxScriptEngine “ bieten eine Schnittstelle zum Windows Script Host.
Es werden einige Beispielanwendungen bereitgestellt, die Standard-ActiveX-Steuerelemente verwenden, um hochentwickelte Benutzeroberflächenfunktionen bereitzustellen.
Verwendung der Bibliothek
Um Qt-Anwendungen zu erstellen, die COM-Objekte und ActiveX-Steuerelemente hosten können, verknüpfen Sie die Anwendung mit dem Modul „ QAxContainer “, indem Sie
QT += axcontainerin die ` .pro `-Datei Ihrer Anwendung ein.
Verteilung von QAxContainer-Anwendungen
Die Bibliothek „ QAxContainer “ ist statisch, sodass bei der Verwendung dieses Moduls keine zusätzlichen Dateien weiterverteilt werden müssen. Beachten Sie jedoch, dass die von Ihnen verwendeten ActiveX-Server-Binärdateien möglicherweise nicht auf dem Zielsystem installiert sind; daher müssen Sie diese mit Ihrem Paket ausliefern und sie während des Installationsprozesses Ihrer Anwendung registrieren.
Instanziieren von COM-Objekten
Um ein COM-Objekt zu instanziieren, verwenden Sie die API `QAxBase::setControl()` oder übergeben Sie den Namen des Objekts direkt an den Konstruktor der von Ihnen verwendeten Unterklasse von ` QAxBase `.
Das Steuerelement kann in verschiedenen Formaten angegeben werden, am schnellsten und leistungsfähigsten ist jedoch die direkte Verwendung der Klassen-ID (CLSID) des Objekts. Der Klassen-ID können Informationen über einen Remote-Rechner vorangestellt werden, auf dem das Objekt ausgeführt werden soll, und sie kann einen Lizenzschlüssel für lizenzierte Steuerelemente enthalten.
Typische Fehlermeldungen
ActiveQt gibt Fehlermeldungen in die Debug-Ausgabe aus, wenn es zur Laufzeit auf Fehlersituationen stößt. In der Regel müssen Sie Ihr Programm im Debugger ausführen, um diese Meldungen zu sehen (z. B. in der Debug-Ausgabe von Visual Studio).
Das angeforderte Steuerelement konnte nicht instanziiert werden
Das in QAxBase::setControl() angeforderte Steuerelement ist auf diesem System nicht installiert oder für den aktuellen Benutzer nicht zugänglich.
Das Steuerelement erfordert möglicherweise Administratorrechte oder einen Lizenzschlüssel. Wenn das Steuerelement lizenziert ist, übergeben Sie den Lizenzschlüssel wie dokumentiert an QAxBase::setControl.
Zugriff auf die Objekt-API
ActiveQt stellt eine Qt-API für das COM-Objekt bereit und ersetzt COM-Datentypen durch entsprechende Qt-Entsprechungen.
Es gibt vier Möglichkeiten, APIs des COM-Objekts aufzurufen:
- Erstellen eines C++-Namespace
- Aufruf nach Namen
- Über eine Skript-Engine
- Verwendung der nativen COM-Schnittstellen
Erstellen eines C++-Namespace
Um einen C++-Namespace für die Typbibliothek zu generieren, auf die Sie zugreifen möchten, verwenden Sie das Tool „dumpcpp “. Führen Sie dieses Tool manuell für die gewünschte Typbibliothek aus oder integrieren Sie es in das Build-System, indem Sie die Typbibliotheken der Variablen „ TYPELIBS “ in der Datei „ .pro “ Ihrer Anwendung hinzufügen:
TYPELIBS = file.tlbBeachten Sie, dass „dumpcpp“ möglicherweise nicht alle APIs der Typbibliothek bereitstellen kann.
Binden Sie die resultierende Header-Datei in Ihren Code ein, um über die generierten C++-Klassen auf die Objekt-APIs zuzugreifen. Weitere Informationen finden Sie im Beispiel „Qutlook “.
Call-by-Name
Verwenden Sie die APIs ` QAxBase::dynamicCall()` und ` QAxBase::querySubObject()` sowie ` QObject::setProperty()` und ` QObject::property()`, um die Methoden und Eigenschaften des COM-Objekts über deren Namen aufzurufen. Verwenden Sie das Tool `dumpdoc`, um die Dokumentation der Qt-API für ein beliebiges COM-Objekt und dessen Unterobjekte abzurufen; beachten Sie, dass möglicherweise nicht alle APIs des COM-Objekts verfügbar sind.
Aufruf von Funktionen über eine Skript-Engine
Eine Qt-Anwendung kann jede auf dem System installierte ActiveScript-Engine hosten. Die Skript-Engine kann dann Skriptcode ausführen, der auf die COM-Objekte zugreift.
Um eine Skript-Engine zu instanziieren, verwenden Sie ` QAxScriptManager::addObject()` zur Registrierung der COM-Objekte, auf die Sie per Skript zugreifen möchten, und ` QAxScriptManager::load()` zum Laden des Skriptcodes in die Engine. Rufen Sie anschließend die Skriptfunktionen mit ` QAxScriptManager::call()` oder ` QAxScript::call()` auf.
Welche APIs des COM-Objekts über Skripte verfügbar sind, hängt von der verwendeten Skriptsprache ab.
Der ActiveX-Testcontainer veranschaulicht das Laden von Skriptdateien.
Aufruf einer Funktion über die nativen COM-Schnittstellen
Um Funktionen des COM-Objekts aufzurufen, auf die mit keiner der oben genannten Methoden zugegriffen werden kann, ist es möglich, die COM-Schnittstelle direkt über ` QAxBase::queryInterface()` anzufordern. Um eine C++-Definition der jeweiligen Schnittstellenklassen zu erhalten, verwenden Sie die Direktive ` #import ` mit der zum Steuerelement gehörenden Typbibliothek; Einzelheiten finden Sie im Handbuch Ihres Compilers.
Typische Fehlermeldungen
ActiveQt gibt Fehlermeldungen in die Debug-Ausgabe aus, wenn es zur Laufzeit auf Fehlersituationen stößt. In der Regel müssen Sie Ihr Programm im Debugger ausführen, um diese Meldungen zu sehen (z. B. in der Debug-Ausgabe von Visual Studio).
QAxBase::internalInvoke: Keine solche Methode
Ein Aufruf von ` QAxBase::dynamicCall()` ist fehlgeschlagen – der Funktionsprototyp stimmte mit keiner in der API des Objekts verfügbaren Funktion überein.
Fehler beim Aufruf eines IDispatch-Mitglieds: Nicht-optionaler Parameter fehlt
Ein Aufruf von ` QAxBase::dynamicCall()` ist fehlgeschlagen – der Funktionsprototyp war korrekt, es wurden jedoch zu wenige Parameter übergeben.
Fehler beim Aufruf eines IDispatch-Mitglieds: Typkonflikt im Parameter n
QAxBase::dynamicCall() ist fehlgeschlagen – der Funktionsprototyp war korrekt, aber der Parameter am Index n hatte den falschen Typ und konnte nicht in den richtigen Typ umgewandelt werden.
QAxScriptManager::call(): Kein Skript stellt diese Funktion bereit
Sie versuchen, eine Funktion aufzurufen, die über eine Engine bereitgestellt wird, die keine Introspektion unterstützt (z. B. ActivePython oder ActivePerl). Sie müssen die Funktion direkt am jeweiligen QAxScript -Objekt aufrufen.
Siehe auch ActiveQt-Framework.
© 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.