Как убить 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 вообче?
Заранее спасибо.
С компонентом TExcelApplication пока никаких дел не имел. Но разве delete недостаточно, чтобы убрать его.
По моему нашел... Но надо проверить... есть указатели на WorkBook... на ту память... надо их занулить... Но может и не прав.
_____
Не получается... все указатели занулил... не освобождает...
ExcelApplication1->Quit();
ExcelApplication1->Disconnect();
ExcelApplication1->Free();
может Quit должен быть позже?
Попробуй еще поиграться с последовательностью команд
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 сам...
Может тогда попытаться закрывать Excel принудительно. Слать ему сообщение на закрытие и т.д.
Excel слать бесполезно... можно тока через TerminateProcess, но не хочется так извращаться.
PS. вроде нет указателей то - вот код функции, после которй процесс сидит в памяти:
{
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;
}
столкнулся со следующей проблеммой - если работать с 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
Что-то вроде
delete ExcelApplication2;
может так и проще, но там в примере он тоже не закрывается... только после выхода из приложения :(
А ты пробовал delete?
Что-то вроде
delete ExcelApplication2;
пробывал
...
Может есть директивы компилятору - типа ХЕРАЧИТЬ все локальные переменные На.. и сразу после выхода?
пробывал
...
Может есть директивы компилятору - типа ХЕРАЧИТЬ все локальные переменные На.. и сразу после выхода?
Получилось!
надо:
1. не делать экземпляров WorkBook
2. не надо делать Quit(); - только Disconnect;
:)
Получилось!
надо:
1. не делать экземпляров WorkBook
2. не надо делать Quit(); - только Disconnect;
:)
Поздравляю! Кто ищет, тот всегда добьет...:)
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); - это ещё зачем ?
Разве следующий сделает всё необходимое?