AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 24.03.2017, 16:36   #1  
Pandasama is offline
Pandasama
Участник
 
457 / 137 (5) +++++
Регистрация: 11.08.2014
Адрес: Барнаул
Завершить процесс 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 + Офис 2010 - процесс после выполнения кода не остается.
На Ax2009, Ax2012, Ax2012R3 + Офис 2013 - процесс после выполнения кода остается.

Может быть кто-то сталкивался и знает как лечить?
Старый 26.03.2017, 09:13   #2  
Player1 is offline
Player1
Участник
Самостоятельные клиенты AX
 
306 / 137 (5) +++++
Регистрация: 21.04.2008
- finalize ?
- = null ?
- про displayAlerts
Старый 26.03.2017, 09:20   #3  
Pandasama is offline
Pandasama
Участник
 
457 / 137 (5) +++++
Регистрация: 11.08.2014
Адрес: Барнаул
Как про общие методы я про это слышал и пытался их использовать, но в данном примере - неудачно (возможно, что-то делал криво).

Если у вас в аналогичной ситуации это помогло - не могли бы вы привести рабочий кусок кода?

Если делать процесс экселя видимым, то никаких запросов сохранять/не сохранять - я не получаю, окно экселя закрывается молча (но процесс остается)
Старый 26.03.2017, 12:40   #4  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
В случае работы через .Net еще помогал вызов сборки мусора.
Взаимодействие с Excel через .NET (семейство классов SysExcel)

Может в вашем случае тоже поможет ?
Старый 26.03.2017, 16:33   #5  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Еще можно попробовать явно освободить переменные
COM comDocument;
COM comApplication;
вызовом
comDocument.finalize();
comApplication.finalize();
Старый 27.03.2017, 08:57   #6  
Pandasama is offline
Pandasama
Участник
 
457 / 137 (5) +++++
Регистрация: 11.08.2014
Адрес: Барнаул
Также пробовал через .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();
Процесс Excel в памяти остается (Ax2012R3 + Office 2013)

Ну или такой вариант - аналогично

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.
Старый 27.03.2017, 11:29   #7  
Pandasama is offline
Pandasama
Участник
 
457 / 137 (5) +++++
Регистрация: 11.08.2014
Адрес: Барнаул
Заметил что в течение 5-15 минут зависшие процессы, если их не прибить руками, исчезают сами. То есть какая-то сборка мусора (может быть что-то внутривиндовое) их все-таки подчищает.

Хотелось бы, конечно, форсировать как-то, с учетом того что это не помогло:
X++:
System.GC::Collect();
System.GC::WaitForPendingFinalizers();
Старый 27.03.2017, 11:40   #8  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
А это пробовали?
X++:
comDocument.finalize();
comApplication.finalize();
Старый 27.03.2017, 11:55   #9  
Pandasama is offline
Pandasama
Участник
 
457 / 137 (5) +++++
Регистрация: 11.08.2014
Адрес: Барнаул
Да, я выше привел пример с использованием всех методов:
X++:
        excelDocument.quitApplication(true);
        if (comDocument)
        {
            comDocument.finalize();
            comDocument = null;
        }
        
        if (comApplication)
        {
            comApplication.finalize();
            comApplication = null;
        }
        System.GC::Collect();
        System.GC::WaitForPendingFinalizers();
Старый 28.03.2017, 08:42   #10  
SRF is offline
SRF
Участник
MCBMSS
Axapta Retail User
 
375 / 562 (19) +++++++
Регистрация: 08.08.2007
Записей в блоге: 1
На просторах интернета примеров по теме много, т.е. у многих такая проблема, в целом условно все сводится к тому, что самый действенный способ это просто завершение процесса Excel по его идентификатору(если нужно форсировать закрытие приложения), примеры можно посмотреть вот тут :
Close Excel Process with Interop

Как закрыть процесс Excel? - C#

У меня самого именно таких примеров не было, чтобы оставался висеть процесс Excel после вызовов сборщика, finalize, и обнуления переменной приложения, в исключительных случаях присваивал null всем объектам экселя типа workbooks, workbook и т.д.
__________________
Sergey Nefedov

Последний раз редактировалось SRF; 28.03.2017 в 08:45.
За это сообщение автора поблагодарили: Pandasama (1).
Старый 28.03.2017, 10:19   #11  
Weez is offline
Weez
Участник
Axapta Retail User
 
250 / 84 (3) ++++
Регистрация: 18.01.2006
Адрес: Moscow city
При использовании 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 типов людей: одни понимают двоичную систему, другие - нет.
Старый 29.03.2017, 10:25   #12  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
877 / 649 (23) +++++++
Регистрация: 14.10.2004
А может причина в том, что в ветке
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.
Старый 29.03.2017, 10:35   #13  
Pandasama is offline
Pandasama
Участник
 
457 / 137 (5) +++++
Регистрация: 11.08.2014
Адрес: Барнаул
Цитата:
Сообщение от Ace of Database Посмотреть сообщение
А может причина в том, что в ветке
Нет, в эту ветку код не попадает.

Цитата:
Сообщение от Ace of Database Посмотреть сообщение
Я сейчас интенсивно работаю в AX2012 с Экселем, и таких проблем нет.
Проблема не в Ax2012, а в конкретной версии Офиса (возможно, даже не просто 2013м офисе - а каком-то билде/патче). В Ax 2009, как я писал выше, это тоже проявляется
Старый 29.03.2017, 13:19   #14  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Не совсем по теме, но у Вас антивирус установлен? Не пробовали для тестирования его отключить? Может, это антивирус не дает немедленно закрыть Excel, а потом просто переходит в режим ожидания и далее закрытие по таймауту происходит
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 29.03.2017, 13:26   #15  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
877 / 649 (23) +++++++
Регистрация: 14.10.2004
Цитата:
Сообщение от Pandasama Посмотреть сообщение
Нет, в эту ветку код не попадает.
Он может не попадать туда в пошаговом режиме под отладчиком. А при сквозном выполнении может попасть. COM в отладчике иногда ведет себя по-другому из-за таймаутов.
Теги
excel, excel 2013

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
atinkerersnotebook: Using PowerPivot to Analyze Dynamics AX Data Blog bot DAX Blogs 1 05.10.2013 07:23
atinkerersnotebook: Using the Dynamics AX Excel Add-In Blog bot DAX Blogs 1 25.09.2013 07:11
atinkerersnotebook: Using Service Management to Track Service Orders Blog bot DAX Blogs 1 25.08.2013 19:16
AX 2012 R2 and POS MikeR DAX: Администрирование 107 22.07.2013 15:42
atinkerersnotebook: Using Excel to Import Products & Services in Dynamics AX Blog bot DAX Blogs 0 19.07.2013 15:11
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 20:16.