![]() |
#12 |
Участник
|
Мы решили проблему следующим образом (подходит только для нашего случая, т.к. форма с 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(); } |
|
|
|