QT Word COM
ActiveQt
QThread
дожидаемся завершения работы Word и удаляем файл
//main.cpp
#include "office.h"#include <QtGui/QApplication> #include <Windows.h> #include <QDebug> /* #ifdef _DEBUG #pragma comment(lib, "QAxContainerd.lib") #else #pragma comment(lib, "QAxContainer.lib") #endif */ #include <QUuid> int main(int argc, char *argv[]) { QApplication a(argc, argv); office w; HRESULT h_result = CoInitializeEx(NULL, COINIT_MULTITHREADED); //проверка на то что экземпляр нашей программы уже запущен HANDLE hMutex = CreateMutex( NULL, FALSE, L"MyMutex"); if (GetLastError() == ERROR_ALREADY_EXISTS) { qDebug()<<"EXIST APPLICATION"; } else { } HRESULT i=CoInitializeEx(NULL,COINIT_APARTMENTTHREADED); qDebug()<<(S_OK==i); qDebug()<<(S_FALSE==i); qDebug()<<"=*"; w.show(); return a.exec(); } |
//office.pro
TEMPLATE = appTARGET = DEPENDPATH += . INCLUDEPATH += . # Input HEADERS += office.h tthread.h FORMS += office.ui SOURCES += main.cpp office.cpp tthread.cpp LIBS += -lqaxcontainerd \ -lqaxcontainerd |
//office.h
#ifndef OFFICE_H#define OFFICE_H #include <QtGui/QMainWindow> #include "ui_office.h" #include <QProcess> #include <QThread> #include <Objbase.h> #include <ActiveQt> #include <QVariant> class office : public QMainWindow { Q_OBJECT public: office(QWidget *parent = 0, Qt::WFlags flags = 0); ~office(); void run(const QString& file); void settextEdit(QString str); private: Ui::officeClass ui; public slots: void slot1(); void slot2(); void saveHtml(const QString& path);сохранит набор функции которые можно юзать void exception ( int code, const QString & source, const QString & desc, const QString & help );//исключения void someSlot(QString name , int argc, void* argv);//обработчик всех сигналов }; #endif // OFFICE_H |
//office.cpp
#include "office.h"#include <QProcess> #include <QDebug> #include "tthread.h" #include <QFile> office::office(QWidget *parent, Qt::WFlags flags) : QMainWindow(parent, flags) { ui.setupUi(this); } office::~office() { } void office::slot1() { QString file=this->ui.lineEdit->text().trimmed(); run(file); } void office::slot2() { QString file=this->ui.lineEdit_2->text().trimmed(); run(file); } void office::run( const QString& file ) { TThread *th=new TThread(0,file); qDebug()<<"this->thread() "<<this->thread(); qDebug()<<"th->thread() "<<th->thread(); th->start(); } void office::settextEdit( QString str ) { ui.textEdit->clear(); ui.textEdit->append(str); } void office::saveHtml( const QString& path ) { QFile file(path ); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) return; QTextStream out(&file); out << QString(""+path+"")<<ui.textEdit->toHtml(); file.close(); } void office::exception( int code, const QString & source, const QString & desc, const QString & help ) { qDebug()<<code; qDebug()<<source; qDebug()<<desc; qDebug()<<help; } void office::someSlot( QString name , int argc, void* argv ) { qDebug()<<"someSlot::"<<name; qDebug()<<"someSlot::"<<argc; qDebug()<<"someSlot::"<<argv; } |
//tthread.h
#ifndef TTHREAD_H#define TTHREAD_H #include <QObject> #include <QThread> #include <Windows.h> #include <ActiveQt> class TThread :public QThread { Q_OBJECT public: TThread(QObject *obj=0,const QString& filename=QString()); ~TThread(); QString filename; protected: virtual void run(); public slots: void slotfinished (); void exception ( int code, const QString & source, const QString & desc, const QString & help ); void someSlot(QString name , int argc, void* argv); private: QAxObject* WordApplication; QAxObject* WordDocuments; QAxObject* NewDocument; }; #endif // TTHREAD_H |
//tthread.cpp
#include "tthread.h"#include <QFile> #include <QDebug> TThread::TThread(QObject *obj,const QString& filename): QThread(obj),filename(filename) { qDebug()<<"TThread::TThread() "<<this->thread(); QObject::connect(this,SIGNAL(finished()),this,SLOT(slotfinished())); } TThread::~TThread() { QFile f(this->filename); sleep(2);//подождем пока офис освободит файл и удалим его qDebug()<<"delete file "<<f.remove(filename); qDebug()<<"delete file "<<f.errorString(); qDebug()<<"TThread::~TThread()"; if(WordApplication)delete WordApplication; } void TThread::run() { HRESULT i=CoInitializeEx(NULL,COINIT_APARTMENTTHREADED);//это нужно что бы в потоках можно было работать с com qDebug()<<(S_OK==i); qDebug()<<(S_FALSE==i); WordApplication= new QAxObject("Word.Application" ); WordApplication->setControl("Word.Application"); WordDocuments = WordApplication->querySubObject( "Documents()" ); NewDocument = WordDocuments->querySubObject("Open(QVariant)",QVariant(this->filename)); qDebug()<<QObject::connect(NewDocument,SIGNAL(exception(int ,const QString &,const QString,const QString &)),this,SLOT(exception(int ,const QString &,const QString,const QString &))); //qDebug()<<QObject::connect(NewDocument,SIGNAL(Close()),this,SLOT(slotfinished ())); //сигнал Close нормально поймать не удалось выдавалась ошибка см.ниже пришлось анализировать вообще все сигналы SIGNAL(signal... //ASSERT: "signal.methodType() == QMetaMethod::Signal" in file qaxbase.cpp, line 373; qDebug()<<QObject::connect(NewDocument, SIGNAL(signal(QString, int, void*)), this, SLOT(someSlot(QString, int, void*))); WordApplication->setProperty("Visible", true); exec(); } void TThread::slotfinished() { delete this; } void TThread::exception( int code, const QString & source, const QString & desc, const QString & help ) { qDebug()<<code; qDebug()<<source; qDebug()<<desc; qDebug()<<help; } void TThread::someSlot( QString name , int argc, void* argv ) { qDebug()<<"someSlot::"<<name; qDebug()<<"someSlot::"<<argc; qDebug()<<"someSlot::"<<argv; if("Close()"==name)quit(); } |
Черновик 0 |
Черновик 1 |