Russian Qt Forum

Qt => ActiveX => Тема начата: Alex_M от Февраль 03, 2010, 13:57



Название: Проблема с процессом WINWORD.EXE
Отправлено: Alex_M от Февраль 03, 2010, 13:57
Здравствуйте! Использую компонент QAxWidget для отображения в главном окне своей программы документа Word.
Делаю это стандартным способом: ui.axWidget->setControl("C:/1.doc"), где axWidget собственно сам QAxWidget, размещенный на окно в дизайнере. Все работает нормально, однако после закрытия программы, остается процесс WINWORD.EXE, который подгружает память компьютера пользователя. Как при выходе его можно программно останавить? Буду благодарен за любые советы и помощь.


Название: Re: Проблема с процессом WINWORD.EXE
Отправлено: CroCIV от Февраль 08, 2010, 13:45
пробуй так
ui.axWidget->dynamicCall("Quit()");


Название: Re: Проблема с процессом WINWORD.EXE
Отправлено: Alex_M от Февраль 08, 2010, 17:17
Да вот не помогает, к сожалению  ???
Делаю простейшее тестовое приложение:

test::test(QWidget *parent, Qt::WFlags flags)
   : QMainWindow(parent, flags)
{
   ui.setupUi(this);
   connect (ui.pushButton, SIGNAL (clicked()), this, SLOT (active()));
   connect (ui.pushButton_2, SIGNAL (clicked()), this, SLOT (exit()));
}
void test::active()
{
   ui.axWidget->setControl("C:/1.doc"); // помещаю в QAxWidget документ

}
void test::exit() // это выполняется при закрытии
{
   ui.axWidget->dynamicCall("Quit()"); //не выходит
   ui.axWidget->close(); // виджет с документом закрывается, но процесс Winword.exe остается все равно
}
test::~test()
{

}
Как ни пробовал, не получается (использую MS Office 2007).


Название: Re: Проблема с процессом WINWORD.EXE
Отправлено: CroCIV от Февраль 09, 2010, 15:53
а ну так я и знал, когда ты выполняешь
Код:
ui.axWidget->setControl("C:/1.doc"); 

ты по сути в ui.axWidget получаешь указатель не на обьект Word.Application, как те кажется, а на обьект _Document
вот попробуй выполнить команду
Код:
QString sss = excel->generateDocumentation();
и полученную строку засунь в хтмл файл, и увидишь все доступные свойства и методы этого обьекта.

и дабы в дальнейшем не натыкаться на подобного рода грабли делай как все, как-нить вот так (ну мне лень было под офис код адаптировать, думаю разберешься ;) ) :

Код:
void Create_table_wizard::opnShbln(qulonglong *someExcel)
{
QAxWidget *exc = new QAxWidget("Excel.Application");
exc->setProperty("DisplayAlerts", "0");
*someExcel = (qulonglong) exc;
}

bool Create_table_wizard::chckShblnStts(qulonglong *someExcel, qulonglong *someShab, qulonglong *someSheet, int docCount)
{
QAxObject *workbooks = ((QAxWidget *) *someExcel)->querySubObject( "Workbooks" );
if (workbooks==0)
{
opnShbln(someExcel);
workbooks =((QAxWidget *) *someExcel)->querySubObject( "Workbooks" );
}
int count = workbooks->dynamicCall("Count").toInt();
if (docCount>=count)
{
QSettings sets(MQFWidgets::cp1251toUni("ляляля"),"Data transport");
sets.beginGroup("Settings");
QString s = sets.value("PathToShablon").toString();
sets.endGroup();
if (s==0)
{
QMessageBox::information(0, MQFWidgets::cp1251toUni("Ошибка!"),MQFWidgets::cp1251toUni("Не удалось обратиться к файлу шаблона.\nПроверьте настройки."),QMessageBox::Ok);
return false;
}
QFile qf;
qf.setFileName(s);
if (!qf.exists())
{
QMessageBox::information(0, MQFWidgets::cp1251toUni("Ошибка!"),MQFWidgets::cp1251toUni("Не удалось обратиться к файлу шаблона.\nПроверьте настройки."),QMessageBox::Ok);
return false;
}
*someShab = (qulonglong) workbooks->querySubObject("Open(const QString&)", s);
}
if (!(QAxObject *)*someShab)
{
QMessageBox::critical(0, MQFWidgets::cp1251toUni("Ошибка!"),MQFWidgets::cp1251toUni("Ошибка открытия шаблона."),QMessageBox::Ok);
return false;
}
*someSheet = (qulonglong) ((QAxObject *) *someShab)->querySubObject("Worksheets(2)");
if (!(QAxObject *) *someSheet)
{
QMessageBox::critical(0, MQFWidgets::cp1251toUni("Ошибка!"),MQFWidgets::cp1251toUni("Ошибка открытия шаблона."),QMessageBox::Ok);
return false;
}
return true;
}


Название: Re: Проблема с процессом WINWORD.EXE
Отправлено: Alex_M от Февраль 10, 2010, 13:07
CroCIV, спасибо за помощь. Почти разобрался с твоим кодом. Один момент - никак не пойму переход от QAxWidget к QAxObject. Если делаю так ui.axWidget->setControl("Word.Document"), то в виджете отображается пустой документ и получаю указатель на _Document, если делаю так - ui.axWidget->setControl("Word.Application"), то получаю указатель уже на Application, где все работает (и Open, и Quit, и другие куча методов (generatedocumentation() - это круто, как на ладони)). Одна проблема Word отображается не в axWidget, а отдельно от моей программы. Как же мне его впихнуть в виджет? Или может поподробней опишешь переход от QAxObject к QAxWidget?


Название: Re: Проблема с процессом WINWORD.EXE
Отправлено: CroCIV от Февраль 10, 2010, 13:58

Попробуй тогда вот так: 
Код:
ui.axWidget->setControl("C:/1.doc");
QAxObject *app = ui.axWidget->querySubObject("Application");
app->dynamicCall("Quit()");


Название: Re: Проблема с процессом WINWORD.EXE
Отправлено: Alex_M от Февраль 10, 2010, 16:50
Ты знаешь смех смехом, но и это не помогает  ::) Уже склоняюсь в ту сторону, чтобы просто убивать при выходе их программы процесс Winword.exe с помощью API