Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как убить Excel???

13K
21 сентября 2005 года
Sergey_S
7 / / 21.09.2005
столкнулся со следующей проблеммой - если работать с Excel через компоненты Builder (Excel_2k), то запущенный процесс Excel болтается в процессах до завершения работы приложения!!!

вот код запуска:

ExcelApplication1 = new TExcelApplication (Application);
ExcelApplication1->ConnectKind = ckNewInstance;
ExcelApplication1->Connect();
ExcelApplication1->set_DisplayAlerts(0, false);
ExcelApplication1->set_Visible(0, true);

вот код завершения (от безысходности тут уже все что придумалось...):

ExcelApplication1->Quit();
ExcelApplication1->Disconnect();
ExcelApplication1->Free();

после ExcelApplication1->Quit() - Excel уже не виден (если Visible = true конечно :) )...
после выполнения ExcelApplication1->Free(); указатель ExcelApplication1 = NULL, но процесс Excel есть и память он ест!!!

Есть необходимость обоработки множества xls документов в цикле. Сначала 1 раз открывал Excel и в нем открывал - закрывал книги. так к концу работы этот Excel жрал более 100Мб и все равно висел в процессах - не катит.

Решил каждый раз закрывать... получил 40 процессов по 20Мб :(

и после закрытия приложения такое чуство, что работает виндовый сборщик мусора...

как корректно выгрузить Excel вообче?

Заранее спасибо.
13K
21 сентября 2005 года
ASmit
10 / / 16.09.2005
С компонентом TExcelApplication пока никаких дел не имел. Но разве delete недостаточно, чтобы убрать его.
13K
21 сентября 2005 года
Sergey_S
7 / / 21.09.2005
Цитата:
Originally posted by ASmit
С компонентом TExcelApplication пока никаких дел не имел. Но разве delete недостаточно, чтобы убрать его.



По моему нашел... Но надо проверить... есть указатели на WorkBook... на ту память... надо их занулить... Но может и не прав.


_____
Не получается... все указатели занулил... не освобождает...

13K
21 сентября 2005 года
ASmit
10 / / 16.09.2005
Попробуй еще поиграться с последовательностью команд

ExcelApplication1->Quit();
ExcelApplication1->Disconnect();
ExcelApplication1->Free();

может Quit должен быть позже?
13K
21 сентября 2005 года
Sergey_S
7 / / 21.09.2005
Цитата:
Originally posted by ASmit
Попробуй еще поиграться с последовательностью команд

ExcelApplication1->Quit();
ExcelApplication1->Disconnect();
ExcelApplication1->Free();

может Quit должен быть позже?



судя по коду компоненты

void __fastcall TExcelApplication :: Disconnect()
{
if (m_DefaultIntf) {
Quit();
if (ServerData->EventIID != GUID_NULL)
DisconnectEvents(GetDunk());
m_DefaultIntf.Reset();
}
}

Disconnect дергает Ouit сам...

13K
21 сентября 2005 года
ASmit
10 / / 16.09.2005
Может тогда попытаться закрывать Excel принудительно. Слать ему сообщение на закрытие и т.д.
13K
21 сентября 2005 года
Sergey_S
7 / / 21.09.2005
Цитата:
Originally posted by ASmit
Может тогда попытаться закрывать Excel принудительно. Слать ему сообщение на закрытие и т.д.



Excel слать бесполезно... можно тока через TerminateProcess, но не хочется так извращаться.

PS. вроде нет указателей то - вот код функции, после которй процесс сидит в памяти:

Код:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  TExcelApplication *ExcelApplication2;
  TExcelWorkbook *ExcelWorkbook3;
  Excel_2k::_WorksheetPtr sheet_act, sheet_proj, sheet_process;
...
...
...

  ExcelApplication2 = new TExcelApplication (NULL);
  ExcelApplication2->ConnectKind = ckNewInstance;
  ExcelApplication2->Connect();
  ExcelApplication2->set_DisplayAlerts(0, false);
  ExcelApplication2->set_Visible(0, true);

  ExcelApplication2->Workbooks->Add((OleVariant)(ExtractFilePath(Application->ExeName) + "Templates\\Wr_TasksList.xls"));
  ExcelWorkbook3 = new TExcelWorkbook (NULL);
  ExcelWorkbook3->ConnectTo(ExcelApplication2->ActiveWorkbook);

  sheet_act     = ExcelWorkbook3->Sheets->get_Item((OleVariant)1);
  sheet_proj    = ExcelWorkbook3->Sheets->get_Item((OleVariant)2);
  sheet_process = ExcelWorkbook3->Sheets->get_Item((OleVariant)3);

...
...
...

 delete(sheet_act);
 delete(sheet_proj);
 delete(sheet_process);

 ExcelWorkbook3->Close();
 ExcelWorkbook3->Disconnect();
 ExcelWorkbook3->Free();
 ExcelWorkbook3 = NULL;

 ExcelApplication2->Quit();
 ExcelApplication2->Disconnect();
 ExcelApplication2->Free();
 ExcelApplication2 = NULL;
}
246
21 сентября 2005 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by Sergey_S
столкнулся со следующей проблеммой - если работать с Excel через компоненты Builder (Excel_2k), то запущенный процесс Excel болтается в процессах до завершения работы приложения!!!

вот код запуска:

ExcelApplication1 = new TExcelApplication (Application);
ExcelApplication1->ConnectKind = ckNewInstance;
ExcelApplication1->Connect();
ExcelApplication1->set_DisplayAlerts(0, false);
ExcelApplication1->set_Visible(0, true);

вот код завершения (от безысходности тут уже все что придумалось...):

ExcelApplication1->Quit();
ExcelApplication1->Disconnect();
ExcelApplication1->Free();

после ExcelApplication1->Quit() - Excel уже не виден (если Visible = true конечно :) )...
после выполнения ExcelApplication1->Free(); указатель ExcelApplication1 = NULL, но процесс Excel есть и память он ест!!!

Есть необходимость обоработки множества xls документов в цикле. Сначала 1 раз открывал Excel и в нем открывал - закрывал книги. так к концу работы этот Excel жрал более 100Мб и все равно висел в процессах - не катит.

Решил каждый раз закрывать... получил 40 процессов по 20Мб :(

и после закрытия приложения такое чуство, что работает виндовый сборщик мусора...

как корректно выгрузить Excel вообче?

Заранее спасибо.


Так наверно проще:
http://www.cbuilder.ru/WinLesson/Winles.htm

13K
21 сентября 2005 года
ASmit
10 / / 16.09.2005
А ты пробовал delete?
Что-то вроде
delete ExcelApplication2;
13K
21 сентября 2005 года
Sergey_S
7 / / 21.09.2005
Цитата:
Originally posted by GIZMO
Так наверно проще:
http://www.cbuilder.ru/WinLesson/Winles.htm


может так и проще, но там в примере он тоже не закрывается... только после выхода из приложения :(

13K
21 сентября 2005 года
Sergey_S
7 / / 21.09.2005
Цитата:
Originally posted by ASmit
А ты пробовал delete?
Что-то вроде
delete ExcelApplication2;



пробывал
...
Может есть директивы компилятору - типа ХЕРАЧИТЬ все локальные переменные На.. и сразу после выхода?

13K
21 сентября 2005 года
Sergey_S
7 / / 21.09.2005
Цитата:
Originally posted by Sergey_S
пробывал
...
Может есть директивы компилятору - типа ХЕРАЧИТЬ все локальные переменные На.. и сразу после выхода?



Получилось!
надо:
1. не делать экземпляров WorkBook
2. не надо делать Quit(); - только Disconnect;
:)

13K
21 сентября 2005 года
ASmit
10 / / 16.09.2005
Цитата:
Originally posted by Sergey_S
Получилось!
надо:
1. не делать экземпляров WorkBook
2. не надо делать Quit(); - только Disconnect;
:)



Поздравляю! Кто ищет, тот всегда добьет...:)

15K
22 декабря 2005 года
maxheadOff
4 / / 22.12.2005
Умы ! Подскажите, как работает метод :

get_Range(VARIANT Cell1/*[in]*/, VARIANT Cell2/*[in,opt]*/)
В cpp он выглядит примерно(наверно) так:

ExcelWorksheet1->get_Range(Variant(A),Variant(B))

У меня он компилируется, но в работе вываливает ошибку, кстати с убийством такая-же печенюшка!

Я там увидел в одном из текстов :
delete(sheet_act);
delete(sheet_proj);
delete(sheet_process); - это ещё зачем ?
Разве следующий сделает всё необходимое?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог