| 
			
			 | 
		#1 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
			
			
			Завершить процесс Excel 2013
			 
			
			Товарищи, после некоторых действий с Excel 2013 - не могу избавиться от висящего процесса. 
		
		
		
		
		
		
		
	Например, вот такой код (чуть модифицированный ComExcelDocument_RU::excelVersion() ) оставляет после себя висеть процесс. X++: static void Job25(Args _args) { ComExcelDocument_RU excelDocument; COM comDocument; COM comApplication; real excelVersion; try { excelDocument = ComExcelDocument_RU::construct(); excelDocument.newFile('', false); comDocument = excelDocument.getComDocument(); if (comDocument) { comApplication = comDocument.application(); if (comApplication) { excelVersion = str2num(comApplication.version()); } } //excelDocument.closeDocument(); excelDocument.quitApplication(true); } catch (Exception::Internal) { excelDocument.closeDocument(); if (comDocument == null || comApplication == null) { throw error("@SYS98748"); } } info(strFmt("%1", excelVersion)); } На Ax2009, Ax2012, Ax2012R3 + Офис 2013 - процесс после выполнения кода остается. Может быть кто-то сталкивался и знает как лечить?  | 
| 
	
 | 
| 
			
			 | 
		#2 | 
| 
			
			 Участник 
		
			
	 | 
	
	|
| 
	
 | 
| 
			
			 | 
		#3 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Как про общие методы я про это слышал и пытался их использовать, но в данном примере - неудачно (возможно, что-то делал криво). 
		
		
		
		
		
		
		
	Если у вас в аналогичной ситуации это помогло - не могли бы вы привести рабочий кусок кода? Если делать процесс экселя видимым, то никаких запросов сохранять/не сохранять - я не получаю, окно экселя закрывается молча (но процесс остается)  | 
| 
	
 | 
| 
			
			 | 
		#4 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			В случае работы через .Net еще помогал вызов сборки мусора. 
		
		
		
		
		
		
		
	Взаимодействие с Excel через .NET (семейство классов SysExcel) Может в вашем случае тоже поможет ?  | 
| 
	
 | 
| 
			
			 | 
		#5 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Еще можно попробовать явно освободить переменные 
		
		
		
		
		
		
		
	COM comDocument; COM comApplication; вызовом comDocument.finalize(); comApplication.finalize();  | 
| 
	
 | 
| 
			
			 | 
		#6 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Также пробовал через .NET вызывать 
		
		
		
		
		
		
		
		
			X++: Microsoft.Office.Interop.Excel.Application tExcel = new Microsoft.Office.Interop.Excel.ApplicationClass(); real version; str strVersion; ; strVersion = tExcel.get_Version(); info(strVersion); tExcel.Quit(); tExcel = null; System.GC::Collect(); System.GC::WaitForPendingFinalizers(); Ну или такой вариант - аналогично X++: static void Job25(Args _args) { ComExcelDocument_RU excelDocument; COM comDocument; COM comApplication; real excelVersion; try { excelDocument = ComExcelDocument_RU::construct(); excelDocument.newFile('', false); comDocument = excelDocument.getComDocument(); if (comDocument) { comApplication = comDocument.application(); if (comApplication) { excelVersion = str2num(comApplication.version()); } } excelDocument.quitApplication(true); if (comDocument) { comDocument.finalize(); comDocument = null; } if (comApplication) { comApplication.finalize(); comApplication = null; } System.GC::Collect(); System.GC::WaitForPendingFinalizers(); } catch (Exception::Internal) { excelDocument.closeDocument(); if (comDocument == null || comApplication == null) { throw error("@SYS98748"); } } info(strFmt("%1", excelVersion)); } Последний раз редактировалось Pandasama; 27.03.2017 в 09:00.  | 
| 
	
 | 
| 
			
			 | 
		#7 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Заметил что в течение 5-15 минут зависшие процессы, если их не прибить руками, исчезают сами. То есть какая-то сборка мусора (может быть что-то внутривиндовое) их все-таки подчищает. 
		
		
		
		
		
		
		
	Хотелось бы, конечно, форсировать как-то, с учетом того что это не помогло: X++: System.GC::Collect(); System.GC::WaitForPendingFinalizers();  | 
| 
	
 | 
| 
			
			 | 
		#8 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			А это пробовали? 
		
		
		
		
		
		
		
	X++: comDocument.finalize(); comApplication.finalize();  | 
| 
	
 | 
| 
			
			 | 
		#9 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Да, я выше привел пример с использованием всех методов: 
		
		
		
		
		
		
		
	X++: excelDocument.quitApplication(true); if (comDocument) { comDocument.finalize(); comDocument = null; } if (comApplication) { comApplication.finalize(); comApplication = null; } System.GC::Collect(); System.GC::WaitForPendingFinalizers();  | 
| 
	
 | 
| 
			
			 | 
		#10 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			На просторах интернета примеров по теме много, т.е. у многих такая проблема, в целом условно все сводится к тому, что самый действенный способ это просто завершение процесса Excel по его идентификатору(если нужно форсировать закрытие приложения), примеры можно посмотреть вот тут : 
		
		
		
		
		
		
			Close Excel Process with Interop Как закрыть процесс Excel? - C# У меня самого именно таких примеров не было, чтобы оставался висеть процесс Excel после вызовов сборщика, finalize, и обнуления переменной приложения, в исключительных случаях присваивал null всем объектам экселя типа workbooks, workbook и т.д. 
				__________________ 
		
		
		
		
		
			Sergey Nefedov Последний раз редактировалось SRF; 28.03.2017 в 08:45.  | 
| 
	
 | 
|
| За это сообщение автора поблагодарили: Pandasama (1). | |
| 
			
			 | 
		#11 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			При использовании DotNet-сборки Excel закрываю следующим образом -  
		
		
		
		
		
		
			X++: excelDocument.closeDocument(false, fullFileNamePath); excelDocument = null; CodeAccessPermission::revertAssert(); new InteropPermission(InteropKind::ClrInterop).assert(); System.GC::Collect(); System.GC::WaitForPendingFinalizers(); CodeAccessPermission::revertAssert(); 
				__________________ 
		
		
		
		
	Существует 10 типов людей: одни понимают двоичную систему, другие - нет.  | 
| 
	
 | 
| 
			
			 | 
		#12 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			А может причина в том, что в ветке  
		
		
		
		
		
		
		
		
			X++:  catch (Exception::Internal)X++: excelDocument.quitApplication(true);И может быть в основной ветке после вызова excelDocument.quitApplication(true); надо убрать все пляски с comDocument.finalize(); и с comApplication.finalize(); Может быть, само упоминание comDocument и comApplication воскрешают Эксель. Я сейчас интенсивно работаю в AX2012 с Экселем, и таких проблем нет. Все решает excelDocument.quitApplication(true); Последний раз редактировалось Ace of Database; 29.03.2017 в 10:29.  | 
| 
	
 | 
| 
			
			 | 
		#13 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Нет, в эту ветку код не попадает. 
		
		
		
		
		
		
		
	Проблема не в Ax2012, а в конкретной версии Офиса (возможно, даже не просто 2013м офисе - а каком-то билде/патче). В Ax 2009, как я писал выше, это тоже проявляется  | 
| 
	
 | 
| 
			
			 | 
		#14 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Не совсем по теме, но у Вас антивирус установлен? Не пробовали для тестирования его отключить? Может, это антивирус не дает немедленно закрыть Excel, а потом просто переходит в режим ожидания и далее закрытие по таймауту происходит
		 
		
		
		
		
		
		
			
				__________________ 
		
		
		
		
	- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря...  | 
| 
	
 | 
| 
			
			 | 
		#15 | 
| 
			
			 Участник 
		
			
	 | 
	
	|
| 
	
 | 
| Теги | 
| excel, excel 2013 | 
| 
	
	 | 
	
| Опции темы | Поиск в этой теме | 
| Опции просмотра | |
		
  |