Das dumpcpp-Werkzeug (ActiveQt)

Das Werkzeug dumpcpp erzeugt einen C++-Namensraum für eine Typbibliothek.

Um einen C++-Namensraum für eine Typbibliothek zu erzeugen, rufen Sie dumpcpp mit den folgenden Befehlszeilenparametern auf:

OptionErgebnis
EingabeDokumentation für input generieren. input kann eine Typbibliotheksdatei oder eine Typbibliotheks-ID oder eine CLSID oder ProgID für ein Objekt angeben
-o DateiSchreibt die Klassendeklaration in file.h und Meta-Objektinformationen in file.cpp
-n NamespaceErzeugt einen C++-Namensraum namespace
-nometaobjectErzeugt keine .cpp-Datei mit den Metaobjekt-Informationen. Das Metaobjekt wird dann zur Laufzeit erzeugt.
-getfile libidGibt den Dateinamen für die Typelibrary libid auf stdout aus
-compatNamespace mit dynamicCall-kompatibler API generieren
-controlnameVerwendet den Namen der Steuerklasse anstelle der UUID in setControl()
-vVersionsinformationen ausgeben
-hHilfe ausgeben

Das manuelle Ausführen des Tools (und vielleicht sogar das Einchecken der erzeugten Dateien in Ihr Versionskontrollsystem) ist normalerweise ausreichend, da sich Typbibliotheken nur sehr selten ändern. Wenn sich Ihre Typbibliothek häufig ändert, können Sie dumpcpp in das qmake Build-System integrieren. Führen Sie in Ihrer .pro-Datei die Typbibliotheken, die Sie verwenden möchten, in der Variablen TYPELIBS auf:

TEMPLATE = app
TARGET   = qutlook
QT += widgets axcontainer

TYPELIBS = $$system(dumpcpp -getfile {00062FFF-0000-0000-C000-000000000046})

Der generierte Namespace deklariert alle Aufzählungen sowie eine QAxObject Unterklasse für jede coclass und interface, die in der Typbibliothek deklariert sind. Mit dem Attribut control gekennzeichnete Koklassen werden von einer QAxWidget Unterklasse umhüllt.

Die Klassen, die erzeugbare Koklassen umhüllen (d.h. Koklassen, die nicht als noncreatable gekennzeichnet sind), haben einen Standardkonstruktor; dies ist typischerweise eine einzelne Klasse vom Typ Application.

Outlook::Application *outlook = new Outlook::Application;

Alle anderen Klassen können nur durch Übergabe eines IDispatch-Schnittstellenzeigers an den Konstruktor erstellt werden; diese Klassen sollten jedoch nicht explizit erstellt werden. Verwenden Sie stattdessen die entsprechende API der bereits erstellten Objekte.

Outlook::_NameSpace *session = outlook->Session();

Alle Koklassen-Wrapper haben auch einen Konstruktor, der eine Interface-Wrapper-Klasse für jedes implementierte Interface nimmt.

Outlook::NameSpace *session = outlook->Session();

Sie müssen Koklassen erstellen, um eine Verbindung zu Signalen des Unterobjekts herstellen zu können. Beachten Sie, dass der Konstruktor das Schnittstellenobjekt löscht, so dass das Folgende einen Segmentierungsfehler verursachen wird:

Outlook::_NameSpace *tmp = outlook->Session();
Outlook::NameSpace *session = new Outlook::NameSpace(tmp);
delete tmp; // or any other use of tmp: segfault

Wenn der Rückgabetyp einer Koklasse oder eines Schnittstellentyps ist, der in einer anderen Typbibliothek deklariert ist, müssen Sie den Namespace-Header für diese andere Typbibliothek einschließen, bevor Sie den Header für den Namespace einschließen, den Sie verwenden möchten (beide Header müssen mit diesem Tool generiert werden).

Standardmäßig verwenden Methoden und Eigenschaften, die Unterobjekte zurückgeben, den Typ, der in der Typbibliothek verwendet wird. Der Aufrufer der Funktion ist dafür verantwortlich, das zurückgegebene Objekt zu löschen oder zu reparieren. Wenn der Schalter -compat gesetzt ist, haben Eigenschaften und Methoden, die ein COM-Objekt zurückgeben, den Rückgabetyp IDispatch*, und der Namespace deklariert keine Wrapper-Klassen für Schnittstellen.

In diesem Fall müssen Sie die richtige Wrapper-Klasse explizit erstellen:

Outlook::NameSpace *session = new Outlook::NameSpace(outlook->Session());

Sie können natürlich das zurückgegebene IDispatch* direkt verwenden, in diesem Fall müssen Sie Release() aufrufen, wenn Sie mit der Schnittstelle fertig sind.

Alle Klassen im Namespace sind mit einem Makro versehen, mit dem Sie sie aus einer DLL exportieren oder importieren können. Dazu deklarieren Sie das Makro, um es zu __declspec(dllimport/export) zu erweitern, bevor Sie die Header-Datei einfügen.

Um das Tool zu erstellen, müssen Sie zunächst die Bibliothek QAxContainer erstellen. Führen Sie dann Ihr make-Tool in tools/dumpcpp aus.

© 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.