Das Tool „dumpcpp“ (ActiveQt)

Das Tool „ dumpcpp “ generiert einen C++-Namespace für eine Typbibliothek.

Um einen C++-Namespace für eine Typbibliothek zu generieren, rufen Sie „ dumpcpp “ mit den folgenden Befehlszeilenparametern auf:

OptionErgebnis
inputDokumentation für „input“ generieren. „input“ kann eine Typbibliotheksdatei, eine Typbibliotheks-ID, eine CLSID oder eine ProgID für ein Objekt angeben
-o fileSchreibt die Klassendeklaration in die Datei „file.h“ und die Metaobjektinformationen in die Datei „file.cpp“
-n NamensraumErzeugt einen C++-Namespace „namespace“
-nometaobjectKeine .cpp-Datei mit den Metaobjekt-Informationen generieren. Das Metaobjekt wird dann zur Laufzeit generiert.
-getfile libidGibt den Dateinamen der Typbibliothek „libid“ auf stdout aus
-compatErzeugt einen Namespace mit einer dynamicCall-kompatiblen API
-controlnameVerwende den Namen der Steuerungsklasse anstelle der UUID in setControl()
-vVersionsinformationen ausgeben
-hHilfe anzeigen

Das manuelle Ausführen des Tools (und eventuell sogar das Einchecken der generierten Dateien in Ihr Versionskontrollsystem) reicht in der Regel aus, 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 jeweils eine „ QAxObject “-Unterklasse für jede in der Typbibliothek deklarierte „ coclass “- und „ interface “-Klasse. Coclasses, die mit dem Attribut „ control “ gekennzeichnet sind, werden von einer „ QAxWidget “-Unterklasse umschlossen.

Diejenigen Klassen, die erstellbare Coclasses umschließen (d. h. Coclasses, die nicht als „ noncreatable “ gekennzeichnet sind), verfügen über einen Standardkonstruktor; dabei handelt es sich in der Regel um 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 bereits erstellter Objekte.

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

Alle Coclass-Wrapper verfügen zudem über jeweils einen Konstruktor, der für jede implementierte Schnittstelle eine Schnittstellen-Wrapper-Klasse entgegennimmt.

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

Sie müssen Coclasses erstellen, um eine Verbindung zu den Signalen des Unterobjekts herstellen zu können. Beachten Sie, dass der Konstruktor das Schnittstellenobjekt löscht, sodass der folgende Code einen Segmentierungsfehler verursacht:

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 ein Coclass- oder Schnittstellentyp ist, der in einer anderen Typbibliothek deklariert wurde, müssen Sie den Namespace-Header dieser anderen Typbibliothek einbinden, bevor Sie den Header für den Namespace einbinden, den Sie verwenden möchten (beide Header müssen mit diesem Tool generiert worden sein).

Standardmäßig verwenden Methoden und Eigenschaften, die Unterobjekte zurückgeben, den Typ aus der Typbibliothek. Der Aufrufer der Funktion ist dafür verantwortlich, das zurückgegebene Objekt zu löschen oder einer neuen übergeordneten Klasse zuzuordnen. 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.

Erstellen Sie in diesem Fall die richtige Wrapper-Klasse explizit:

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

Sie können natürlich auch den direkt zurückgegebenen `IDispatch*`-Zeiger verwenden; in diesem Fall müssen Sie ` Release() ` aufrufen, sobald Sie die Schnittstelle nicht mehr benötigen.

Alle Klassen im Namespace sind mit einem Makro versehen, das es Ihnen ermöglicht, sie aus einer DLL zu exportieren oder in diese zu importieren. Dazu müssen Sie das Makro so deklarieren, dass es zu „ __declspec(dllimport/export) “ erweitert wird, bevor Sie die Header-Datei einbinden.

Um das Tool zu erstellen, müssen Sie zunächst die Bibliothek „ QAxContainer “ erstellen. Führen Sie anschließend Ihr Make-Tool unter „ tools/dumpcpp “ aus.

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