|
![]() |
#1 |
Участник
|
И этот вариант мы тоже уже пробовали. Не помогает. Процесс остается висеть
|
|
![]() |
#2 |
Участник
|
Цитата:
X++: excelDocument.visible(true);
__________________
// no comments |
|
![]() |
#3 |
Участник
|
Делала. Документ excel исчезает (закрывается), а процесс все равно висеть остается.
|
|
![]() |
#4 |
Участник
|
|
|
![]() |
#5 |
Участник
|
На "displayAlerts" просто ругается при выполнении. А убить получилось только process.Kill(), но ведь это не выход. При этом будут закрыты все excel-ские файлы.
|
|
![]() |
#6 |
Участник
|
Мы решили проблему следующим образом (подходит только для нашего случая, т.к. форма с ActiveX компонентой не открывается, если есть хотя бы один запущенный процесс Excel): при создании Excel-документа запоминаем соответствующие процессы, а при закрытии формы именно их и убиваем. Таким образом, если после открытия нашей формы, пользователь работал с какими-то другими excel-документами, они останутся открытыми.
X++: void createExcelDocument(Object _webBrowser) { System.Collections.IEnumerable processes; System.Collections.IEnumerator enumerator; System.Diagnostics.Process process; int idExcel; if (_webBrowser) { try { comWorkbook = null; excelDocument = null; comWorkbook = _webBrowser.document(); if (comWorkbook && comWorkbook.toString() == #documentObjectStr) { excelDocument = ComExcelDocument_RU::newFromCOMDocument(comWorkbook); listExcelPidId = new set (types::Integer); processes = System.Diagnostics.Process::GetProcessesByName("EXCEL"); enumerator = processes.GetEnumerator(); while (enumerator.MoveNext()) { process = enumerator.get_Current(); idExcel = process.get_Id(); listExcelPidId.add(idExcel); } if (comWorkbook && excelDocument.isDocumentValid()) { comWorkbook.saved(true); } } else { comWorkbook = null; } } catch (Exception::Internal) { if (comWorkbook == null) { documentTabPage.visible(false); throw error("@SYS98748"); } } } } X++: public void close() { System.Diagnostics.Process process; SetIterator si; int idPid; ; SysHelp::initWebBrowser(excelBrowser); si = new SetIterator(listExcelPidId) ; while (si.more () ) { idPid = si.value(); process = System.Diagnostics.Process::GetProcessById(idPid); process.Kill(); si.next () ; } super(); } |
|
|
|