AXForum  
Zurück   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Kennwort vergessen?
Registrieren Forum Rules Hilfe Benutzerliste Heutige Beiträge Suchen Alle Foren als gelesen markieren

 
 
Themen-Optionen Thema durchsuchen Ansicht
Alt 24.03.2017, 16:36   #1  
Pandasama ist offline
Pandasama
Участник
 
473 / 140 (5) +++++
Registriert seit: 11.08.2014
Ort: Барнаул
Завершить процесс 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 - процесс после выполнения кода остается.

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

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

Если делать процесс экселя видимым, то никаких запросов сохранять/не сохранять - я не получаю, окно экселя закрывается молча (но процесс остается)
Alt 26.03.2017, 12:40   #4  
Logger ist offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
4.004 / 3299 (118) ++++++++++
Registriert seit: 12.10.2004
Ort: Москва
Blog-Einträge: 2
В случае работы через .Net еще помогал вызов сборки мусора.
Взаимодействие с Excel через .NET (семейство классов SysExcel)

Может в вашем случае тоже поможет ?
Alt 26.03.2017, 16:33   #5  
Logger ist offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
4.004 / 3299 (118) ++++++++++
Registriert seit: 12.10.2004
Ort: Москва
Blog-Einträge: 2
Еще можно попробовать явно освободить переменные
COM comDocument;
COM comApplication;
вызовом
comDocument.finalize();
comApplication.finalize();
Alt 27.03.2017, 08:57   #6  
Pandasama ist offline
Pandasama
Участник
 
473 / 140 (5) +++++
Registriert seit: 11.08.2014
Ort: Барнаул
Также пробовал через .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));
}

Geändert von Pandasama (27.03.2017 um 09:00 Uhr)
Alt 27.03.2017, 11:29   #7  
Pandasama ist offline
Pandasama
Участник
 
473 / 140 (5) +++++
Registriert seit: 11.08.2014
Ort: Барнаул
Заметил что в течение 5-15 минут зависшие процессы, если их не прибить руками, исчезают сами. То есть какая-то сборка мусора (может быть что-то внутривиндовое) их все-таки подчищает.

Хотелось бы, конечно, форсировать как-то, с учетом того что это не помогло:
X++:
System.GC::Collect();
System.GC::WaitForPendingFinalizers();
Alt 27.03.2017, 11:40   #8  
Logger ist offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
4.004 / 3299 (118) ++++++++++
Registriert seit: 12.10.2004
Ort: Москва
Blog-Einträge: 2
А это пробовали?
X++:
comDocument.finalize();
comApplication.finalize();
Alt 27.03.2017, 11:55   #9  
Pandasama ist offline
Pandasama
Участник
 
473 / 140 (5) +++++
Registriert seit: 11.08.2014
Ort: Барнаул
Да, я выше привел пример с использованием всех методов:
X++:
        excelDocument.quitApplication(true);
        if (comDocument)
        {
            comDocument.finalize();
            comDocument = null;
        }
        
        if (comApplication)
        {
            comApplication.finalize();
            comApplication = null;
        }
        System.GC::Collect();
        System.GC::WaitForPendingFinalizers();
Alt 28.03.2017, 08:42   #10  
SRF ist offline
SRF
Участник
MCBMSS
Axapta Retail User
 
376 / 562 (19) +++++++
Registriert seit: 08.08.2007
Blog-Einträge: 1
На просторах интернета примеров по теме много, т.е. у многих такая проблема, в целом условно все сводится к тому, что самый действенный способ это просто завершение процесса Excel по его идентификатору(если нужно форсировать закрытие приложения), примеры можно посмотреть вот тут :
Close Excel Process with Interop

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

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

Geändert von SRF (28.03.2017 um 08:45 Uhr)
This post has been rated by: Pandasama (1).
Alt 28.03.2017, 10:19   #11  
Weez ist offline
Weez
Участник
Axapta Retail User
 
250 / 89 (3) ++++
Registriert seit: 18.01.2006
Ort: 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 типов людей: одни понимают двоичную систему, другие - нет.
Alt 29.03.2017, 10:25   #12  
Ace of Database ist offline
Ace of Database
Участник
Benutzerbild von Ace of Database
 
877 / 649 (23) +++++++
Registriert seit: 14.10.2004
А может причина в том, что в ветке
X++:
 catch (Exception::Internal)
нет вызова
X++:
excelDocument.quitApplication(true);

И может быть в основной ветке после вызова excelDocument.quitApplication(true); надо убрать все пляски с comDocument.finalize(); и с comApplication.finalize(); Может быть, само упоминание comDocument и comApplication воскрешают Эксель.
Я сейчас интенсивно работаю в AX2012 с Экселем, и таких проблем нет. Все решает excelDocument.quitApplication(true);

Geändert von Ace of Database (29.03.2017 um 10:29 Uhr)
Alt 29.03.2017, 10:35   #13  
Pandasama ist offline
Pandasama
Участник
 
473 / 140 (5) +++++
Registriert seit: 11.08.2014
Ort: Барнаул
Zitat:
Zitat von Ace of Database Beitrag anzeigen
А может причина в том, что в ветке
Нет, в эту ветку код не попадает.

Zitat:
Zitat von Ace of Database Beitrag anzeigen
Я сейчас интенсивно работаю в AX2012 с Экселем, и таких проблем нет.
Проблема не в Ax2012, а в конкретной версии Офиса (возможно, даже не просто 2013м офисе - а каком-то билде/патче). В Ax 2009, как я писал выше, это тоже проявляется
Alt 29.03.2017, 13:19   #14  
Владимир Максимов ist offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1.726 / 1208 (44) ++++++++
Registriert seit: 13.01.2004
Blog-Einträge: 3
Не совсем по теме, но у Вас антивирус установлен? Не пробовали для тестирования его отключить? Может, это антивирус не дает немедленно закрыть Excel, а потом просто переходит в режим ожидания и далее закрытие по таймауту происходит
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Alt 29.03.2017, 13:26   #15  
Ace of Database ist offline
Ace of Database
Участник
Benutzerbild von Ace of Database
 
877 / 649 (23) +++++++
Registriert seit: 14.10.2004
Zitat:
Zitat von Pandasama Beitrag anzeigen
Нет, в эту ветку код не попадает.
Он может не попадать туда в пошаговом режиме под отладчиком. А при сквозном выполнении может попасть. COM в отладчике иногда ведет себя по-другому из-за таймаутов.
Stichworte
excel, excel 2013

 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
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
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Gehe zu

Рейтинг@Mail.ru
Alle Zeitangaben in WEZ +3. Es ist jetzt 17:27 Uhr.
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.