Verwendung von ActiveX-Steuerelementen und COM in Qt
Das Modul QAxContainer ist Teil des ActiveQt-Frameworks. Es bietet eine Bibliothek, die eine QWidget Unterklasse, QAxWidget, implementiert, die als Container für ActiveX-Steuerelemente fungiert, und eine QObject Unterklasse, QAxObject, die für den einfachen Zugriff auf nicht-visuelle COM-Objekte verwendet werden kann. Das Skripten von COM-Objekten, die in diese Klassen eingebettet sind, ist über die Klassen QAxScript, QAxScriptManager und QAxScriptEngine möglich, und eine Reihe von Tools erleichtert den programmatischen Zugriff auf COM-Objekte.
Das Modul besteht aus sechs Klassen
- QAxBase ist eine abstrakte Klasse, die eine API für die Initialisierung und den Zugriff auf ein COM-Objekt oder ActiveX-Steuerelement bereitstellt.
- QAxObject bietet eine QObject, die ein COM-Objekt umhüllt.
- QAxWidget ist eine QWidget, die ein ActiveX-Steuerelement umhüllt.
- QAxScriptManager QAxScript und bieten eine Schnittstelle zum Windows Script Host. QAxScriptEngine
Es werden einige Beispielanwendungen bereitgestellt, die Standard-ActiveX-Steuerelemente verwenden, um High-Level-Benutzerschnittstellenfunktionen 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 += axcontainer
in die .pro
Datei Ihrer Anwendung einfügen.
Verteilen von QAxContainer-Anwendungen
Die QAxContainer Bibliothek ist statisch, daher ist es nicht notwendig, zusätzliche Dateien zu verteilen, wenn Sie dieses Modul verwenden. Beachten Sie jedoch, dass die ActiveX-Server-Binärdateien, die Sie verwenden, möglicherweise nicht auf dem Zielsystem installiert sind, so dass Sie sie mit Ihrem Paket ausliefern und während des Installationsprozesses Ihrer Anwendung registrieren müssen.
Instanziierung von COM-Objekten
Um ein COM-Objekt zu instanziieren, verwenden Sie die QAxBase::setControl() API, oder übergeben Sie den Namen des Objekts direkt in den Konstruktor der QAxBase Subklasse, die Sie verwenden.
Das Steuerelement kann in einer Vielzahl von Formaten angegeben werden, aber das schnellste und leistungsfähigste Format ist die direkte Verwendung der Klassen-ID (CLSID) des Objekts. Der Klassen-ID können Informationen über einen entfernten 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 auf der Debug-Ausgabe aus, wenn es zur Laufzeit auf Fehlersituationen stößt. Normalerweise müssen Sie Ihr Programm im Debugger ausführen, um diese Meldungen zu sehen (z.B. in der Debug-Ausgabe von Visual Studio).
Angefordertes Control konnte nicht instanziiert werden
Das in QAxBase::setControl() angeforderte Steuerelement ist auf diesem System nicht installiert, oder es ist 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 an QAxBase::setControl wie dokumentiert.
Zugriff auf die Objekt-API
ActiveQt bietet eine Qt-API für das COM-Objekt und ersetzt COM-Datentypen durch Qt-Äquivalente.
Es gibt vier Möglichkeiten, APIs für das COM-Objekt aufzurufen:
- Erzeugen eines C++ Namespace
- Aufruf nach Namen
- Über eine Skript-Engine
- Verwendung der nativen COM-Schnittstellen
Erzeugen eines C++-Namensraumes
Um einen C++-Namensraum für die Typbibliothek zu erzeugen, auf die Sie zugreifen möchten, verwenden Sie das Tool dumpcpp. Führen Sie dieses Tool manuell für die Typbibliothek aus, die Sie verwenden möchten, oder integrieren Sie es in das Build-System, indem Sie die Typbibliotheken zur Variable TYPELIBS
in der Datei .pro
Ihrer Anwendung hinzufügen:
TYPELIBS = file.tlb
Beachten Sie, dass dumpcpp möglicherweise nicht alle APIs in der Typbibliothek offenlegen kann.
Fügen Sie die resultierende Header-Datei in Ihren Code ein, um über die generierten C++-Klassen auf die Objekt-APIs zuzugreifen. Siehe das Qutlook-Beispiel für weitere Informationen.
Aufruf nach Namen
Verwenden Sie QAxBase::dynamicCall() und QAxBase::querySubObject() sowie die APIs QObject::setProperty() und QObject::property(), um die Methoden und Eigenschaften des COM-Objekts über ihren Namen aufzurufen. Verwenden Sie das Werkzeug dumpdoc, um die Dokumentation der Qt-API für jedes COM-Objekt und seine Unterobjekte zu erhalten; beachten Sie, dass möglicherweise nicht alle APIs des COM-Objekts verfügbar sind.
Funktionsaufruf durch eine Script 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(), um die COM-Objekte zu registrieren, auf die Sie über das Skript zugreifen möchten, und QAxScriptManager::load(), um den Skriptcode in die Engine zu laden. Rufen Sie dann die Skriptfunktionen mit QAxScriptManager::call() oder QAxScript::call() auf.
Welche APIs des COM-Objekts über Scripting verfügbar sind, hängt von der verwendeten Skriptsprache ab.
Der ActiveX Test Container demonstriert das Laden von Skriptdateien.
Aufrufen einer Funktion über die nativen COM-Schnittstellen
Um Funktionen des COM-Objekts aufzurufen, die nicht über eine der oben genannten Methoden erreicht werden können, ist es möglich, die COM-Schnittstelle direkt mit QAxBase::queryInterface() anzufordern. Um eine C++-Definition der entsprechenden Schnittstellenklassen zu erhalten, verwenden Sie die Direktive #import
mit der Typbibliothek, die mit dem Steuerelement geliefert wird; Einzelheiten finden Sie in Ihrem Compiler-Handbuch.
Typische Fehlermeldungen
ActiveQt gibt Fehlermeldungen auf der Debug-Ausgabe aus, wenn es zur Laufzeit auf Fehlersituationen stößt. Normalerweise 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 QAxBase::dynamicCall() ist fehlgeschlagen - der Funktionsprototyp stimmt mit keiner in der API des Objekts verfügbaren Funktion überein.
Fehler beim Aufruf eines IDispatch-Mitglieds: Nicht-optionaler Parameter fehlt
Ein QAxBase::dynamicCall() ist fehlgeschlagen - der Funktionsprototyp war korrekt, aber es wurden zu wenige Parameter übergeben.
Fehler beim Aufruf eines IDispatch-Mitglieds: Typ-Fehlanpassung im Parameter n
Ein QAxBase::dynamicCall() ist fehlgeschlagen - der Funktionsprototyp war korrekt, aber der Parameter bei Index n
war vom falschen Typ und konnte nicht in den richtigen Typ umgewandelt werden.
QAxScriptManager::call(): Kein Skript bietet diese Funktion an
Sie versuchen, eine Funktion aufzurufen, die über eine Engine bereitgestellt wird, die keine Introspektion bietet (z. B. ActivePython oder ActivePerl). Sie müssen die Funktion direkt über das entsprechende QAxScript Objekt aufrufen.
Siehe auch ActiveQt Framework.
© 2025 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.