[Qt] QAxObject – как правильно освободить память.

Для использования COM-объектов под Windows в Qt используется специальный класс – QAxObject.
Для его использования под GPL-лицензией необходимо зайти в папку qt/src/activeqt – и выполнить qmake и make install, а так же подключить библиотеку в проект:

[code]
.pro
CONFIG += qaxcontainer
[/code]
после чего можно использовать, например открыть файл экселя и получить количество используемых строк и столбцов на листе с именем “Sheet1”:

~.h
#include
#include

QAxWidget *excel;
QAxObject *workbooks;
QAxObject *workbook;
QAxObject *sheet;
int mRows;
int mCols;

~.cpp
excel = new QAxWidget(“Excel.Application”);

excel->setProperty(“Visible”, false);
workbooks = excel->querySubObject(“WorkBooks”);
workbook = workbooks->querySubObject(“Open (const QString&)”, mFileName);
sheet = workbook->querySubObject(“Worksheets(const QVariant&)”, “Sheet1”);
QAxObject *usedRange = sheet->querySubObject(“UsedRange”);
QAxObject *usedRows = usedRange->querySubObject(“Rows”);
QAxObject *usedCols = usedRange->querySubObject(“Columns”);

mRows = usedRows->property(“Count”).toInt();
mCols = usedCols->property(“Count”).toInt();
delete usedCols;
delete usedRows;
delete usedRange;
Но – по завершении задачи процесс EXCEL.EXE продолжает висеть и занимать память – и так происходит при каждом запуске. Как правильно эту память очистить?
делается это следующим образом (в частности для Excel):

sheet->clear();
delete sheet;
sheet = NULL;
workbook->clear();
delete workbook;
workbook = NULL;
workbooks->dynamicCall( "Close" );
workbooks->clear();
delete workbooks;
workbooks = NULL;
excel->dynamicCall( "Quit" );
delete excel;
excel = NULL;

т.е. в данном случае для объекта рабочей книги мы вызываем метод Close(), а для собственно приложения MSExcel – нужно вызвать метод Quit(). Естественно, что для других серверов автоматизации в деталях процесс будет отличаться – но общий принцип думаю понятен.
Если у вас есть вопросы – задавайте здесь – либо по любому из указанных контактов

©Varkon Ltd 2010
При перепечатке материала ссылка на данный сайт обязательна.
ООО Варкон. Высококачественный сервис и поддержка.

Если статья была полезна вам – не забывайте поделиться ею со своими друзьями в социальных сетях. Если есть вопросы – задавайте в комментариях либо в наших социальных группах.