Qt: fremden Namespace verwenden



  • Momentan versuche ich eine Anwendung zu beenden.
    Für das Beenden benötige ich allerdings Befehle, die ich in QT nicht finden kann.
    In VS 2010 würde das wie folgend aussehen:

    using namespace System;
    using namespace System::Runtime::InteropServices;

    ReleaseComObject(p_Powerpoint);

    http://msdn.microsoft.com/de-de/library/system.runtime.interopservices.marshal.releasecomobject.aspx

    leider ist es mir unter QT nicht möglich auf den namespace System zuzugreifen, da er einfach nicht existiert und ich auch nach mehreren Stunden nichts entsprechendes finden kann. Ich benötige jedoch unbedingt die Methode ReleaseComObject, da Powerpoint ständig als Prozess im Hintergrund weiterläuft.



  • Du bringst hier völlig unterschiedliche Sachen durcheinander. Qt ist nur ein Framework, das hindert dich sicher nicht daran, irgendwelche Namespaces zu benutzen. System::Runtime::InteropServices ist ein .NET Namespace, das ist kein C++. Das kannst du in C++/CLI benutzen, aber es gibt hier schon tausend Threads, warum man kein C++/CLI an sich benutzen sollte. Qt verwendest du in nativen C++ Projekten.
    Die IUnknown Schnittstelle hat schon eine Release Methode, d.h. wenn du einen Zeiger auf ein IUnknown hast, könntest du es direkt aufrufen:

    pPowerpoint->Release();

    Aber ich muss mich natürlich fragen, wo du das Objekt überhaupt herhast, wenn du versuchst Qt und .NET zu mischen.



  • Ich finde nur leider nirgends eine Methode names Release().
    QAxObject* Powerpoint = new QAxObject("Powerpoint.Application",this);
    Leider lässt sich das Objekt nicht löschen, ohne dass im Hintergrund ein Powerpoint Prozess bestehen bleibt.
    Ich habe gelesen, dass man dazu eben diese Methode benötigt.
    Ich kann einfach keine Release Methode finden.



  • laut der docu der Klasse macht der Destruktor ein Release auf die COM-Komponente.
    http://doc-snapshot.qt-project.org/4.8/qaxobject.html#dtor.QAxObject

    Du musst nur das Objekt sauber zerstören. Wenn aber aber der Prozess noch weiter lebt nachdem die QAxObject instanz zerstört wurde, liegt das vermutlich daran, dass noch ein anderer Teil deines Programms eine COM reference offen hält.



  • Sag halt gleich, dass du ActiveQt verwendest. Es gibt sehr viele Möglichkeiten, irgendwas zu machen, und du stellst einfach eine Frage, wo überhaupt nicht klar ist, was du genau machst und was du willst.
    firefly hat Recht, QAxObject müsste das drunterliegende Objekte im Destuktor zerstören. Wenn du trotzdem an das IUnkonwn Objekt direkt rankommen willst, QAxObject leitet von QAxBase ab, und das hat eine queryInterface Methode. Steht alles in der Doku.
    Ein mögliches Problem wäre, dass du noch irgendwo irgendwelche Zwischenobjekte, die du benutzt nicht freigegeben hast. Wenn du noch mehr machst, als nur Powerpoint.Application zu erstellen und dann zu zerstören, dann versuch dein Programm Schritt für SChritt zu reduzieren, bis du siehst, dass es funktioniert hat. Oder umgekehrt, schreib ein minimales Programm, das nur PowerPoint.Application erstellt und gleich wieder zerstört, das sollte eigentlich funktionieren.


Log in to reply