Russian Qt Forum
Май 16, 2024, 13:12 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с процессом WINWORD.EXE  (Прочитано 12552 раз)
Alex_M
Гость
« : Февраль 03, 2010, 13:57 »

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

пробуй так
ui.axWidget->dynamicCall("Quit()");
Записан
Alex_M
Гость
« Ответ #2 : Февраль 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).
Записан
CroCIV
Гость
« Ответ #3 : Февраль 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;
}
« Последнее редактирование: Февраль 09, 2010, 15:56 от CroCIV » Записан
Alex_M
Гость
« Ответ #4 : Февраль 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?
Записан
CroCIV
Гость
« Ответ #5 : Февраль 10, 2010, 13:58 »


Попробуй тогда вот так: 
Код:
ui.axWidget->setControl("C:/1.doc");
QAxObject *app = ui.axWidget->querySubObject("Application");
app->dynamicCall("Quit()");
Записан
Alex_M
Гость
« Ответ #6 : Февраль 10, 2010, 16:50 »

Ты знаешь смех смехом, но и это не помогает  Строит глазки Уже склоняюсь в ту сторону, чтобы просто убивать при выходе их программы процесс Winword.exe с помощью API
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.047 секунд. Запросов: 20.