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