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 = app
TARGET =
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