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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 06.03.2016, 20:00   #1  
vikuss2006 is offline
vikuss2006
Участник
 
42 / 10 (1) +
Регистрация: 22.11.2013
Проблема подключения COM объекта
В Axapata 3.0 подключаю стороннюю библиотеку для получения банковской выписки, выполняю job вида:
try{

COMApplication = new COM("iDocIntegrator.DocOperation");
if(!COMApplication)
{
info("error");
}

ret = COMApplication.Login("login", "pass", "pass", "D:\key");
if(!ret)
{
s = COMApplication.GetDocInfoList("20160218", "20160218");
}
else
{
info(ret);
}
info(s);
COMApplication = null;
}
catch(Exception::Error)
{
COMApplication = null;
throw error("Обработка отменена!");
}
Первые 5 минут данные получены, выводятся на экран, в логе рядом с dll пишет, что подключение происходит и данные получены, в программе "procexp" видно как dll загружена при запуске джобика, но через несколько минут в том же "procexp" видно, что dll сама по себе выгружается из памяти, после чего Аксапта при следующем запуске джобика начинает ругаться Access violation 0х0000000, а при дальнейших запусках джобика Аксапта вообще закрывается. Удивило, что среди функций библиотеки есть только функции получения данных, функция Login, а вот никакого закрытия или выхода не предусмотрено. Вместе с библиотекой в комплекте шел пример Excel, который успешно применяет данную библиотеку, без ошибок. Разработчики посмотрели логи и отписались, что проблемы в Аксапте, ведь их пример excel мол работает.
Старый 06.03.2016, 20:34   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Попробуйте вместо обнуления явно вызвать finalize
Finalize & null
Старый 07.03.2016, 11:01   #3  
vikuss2006 is offline
vikuss2006
Участник
 
42 / 10 (1) +
Регистрация: 22.11.2013
Finalize уже применяла, ошибка осталась, к сожалению!
Старый 09.03.2016, 12:46   #4  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
870 / 637 (23) +++++++
Регистрация: 14.10.2004
Попробуйте переписать в виде vb-скрипта и сохраните скрипт в текстовом файле с расширением .vbs.
X++:
Set COMApplication = CreateObject("iDocIntegrator.DocOperation")
COMApplication.Login "login", "pass", "pass", "D:\key"
s = COMApplication.GetDocInfoList("20160218", "20160218")
MsgBox s
Запустите его из Аксапты командой
PHP код:
static void Job572(Args _args)
{
    ;
    
WinApi::ShellExecute('wscript.exe  ИмяФайла.vbs');

Старый 09.03.2016, 13:50   #5  
vikuss2006 is offline
vikuss2006
Участник
 
42 / 10 (1) +
Регистрация: 22.11.2013
Скорее всего в самом скрипте есть ошибки, не запускается пока что.Неужели только через скрипт можно работать с этой библиотекой.
Старый 09.03.2016, 15:21   #6  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
870 / 637 (23) +++++++
Регистрация: 14.10.2004
Попробуйте через COM + в Windows настроить данный COM-объект. Я уже давно так не делал, поэтому подробностей не помню.
Или возьмите у разработчиков скрипт, который они тестировали в Excel и перепишите его в файл как VBS-скрипт
Старый 09.03.2016, 16:14   #7  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,656 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от vikuss2006 Посмотреть сообщение
в программе "procexp" видно как dll загружена при запуске джобика, но через несколько минут в том же "procexp" видно, что dll сама по себе выгружается из памяти, после чего Аксапта при следующем запуске джобика начинает ругаться Access violation 0х0000000, а при дальнейших запусках джобика Аксапта вообще закрывается.
(...)
Вместе с библиотекой в комплекте шел пример Excel, который успешно применяет данную библиотеку, без ошибок.
При работе через Excel процесс через 5 минут не выгружается? "procexp" показывает что процесс, инициированный Excel живет больше 5 минут?

Для Axapta выгрузка процесса происходит через 5 минут простоя (когда в Axapta ничего не грузится) или может оборвать соединение прямо в процессе загрузки данных? Или в этот момент в Axapta выполнялась какая-то другая обработка?
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 09.03.2016, 18:13   #8  
vikuss2006 is offline
vikuss2006
Участник
 
42 / 10 (1) +
Регистрация: 22.11.2013
никаких обработок в Аксапте не было, т.е. выполнился job, затем просто жду, ничего не делаю я в своей сессии, потом снова запускаю job и ошибка.
Старый 09.03.2016, 20:41   #9  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,656 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от vikuss2006 Посмотреть сообщение
никаких обработок в Аксапте не было, т.е. выполнился job, затем просто жду, ничего не делаю я в своей сессии, потом снова запускаю job и ошибка.
Для Excel также? Или процесс висит бесконечно?
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 10.03.2016, 08:56   #10  
vikuss2006 is offline
vikuss2006
Участник
 
42 / 10 (1) +
Регистрация: 22.11.2013
для Excel процесс висит бесконечно, да, только из Аксапты вылетает.
Старый 10.03.2016, 12:29   #11  
terraByteG is offline
terraByteG
Участник
 
15 / 17 (1) ++
Регистрация: 10.03.2016
Access violation 0х0000000 - то есть пытается получить данные из памяти, но пролетает по nil.

Можно запустить такой код и чего там в info прилетит?


X++:
System.Exception netExcepn;
;
try
{ 
     COMApplication = new COM("iDocIntegrator.DocOperation"); 
     if(!COMApplication)
     {
          info("error");
     }

     ret = COMApplication.Login("login", "pass", "pass", "D:\key");
     if(!ret)
     {
          s = COMApplication.GetDocInfoList("20160218", "20160218");
     }
     else
     {
          info(ret);
     }
     info(s);
     COMApplication = null;
}
catch
{
     netExcepn = CLRInterop::getLastException();
     info(netExcepn.ToString());
     COMApplication = null;
     throw error("Обработка отменена!");
}
Старый 10.03.2016, 14:30   #12  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,656 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от vikuss2006 Посмотреть сообщение
для Excel процесс висит бесконечно, да, только из Аксапты вылетает.
Запустите следующий Job

X++:
static void test_Com(Args _args)
{
    Com     comApplication;
    str     ret;
    str     s;
    int     timeNowBegin;
    int     i;
    ;
    
    timeNowBegin = timeNow();
    
    try
    {
        comApplication = new COM("iDocIntegrator.DocOperation");
        if(!comApplication)
        {
            info("error");
            return;
        }

        ret = comApplication.Login("login", "pass", "pass", "D:\key");
        if(!ret)
        {
            for (i=1; i<=10; i++)
            {
                sleep(1*60*1000);   // Задержка в 1 минуту
                info(strFmt('step = %1, time = %2', i, time2str(timeNow()-timeNowBegin, 1, 1)));
                s = comApplication.GetDocInfoList("20160218", "20160218");
                info(s);
            }
        }
        else
        {
            info(ret);
        }
        comApplication = null;
    }
    catch(Exception::Error)
    {
        comApplication = null;
        throw error("Обработка отменена!");
    }

    comApplication = null;
    
    info('end');
}

Цель этого Job - проверить факт автоматической выгрузки Com-объекта из памяти, в случае, если прошло некоторое фиксированное время простоя без обращения к объекту. Как видите, в Job раз в минуту "дергают" объект. Проверьте, отработает ли этот Job до конца все 10 минут без ошибок или произойдет "вылет" через обнаруженные Вами 3..5 минут?
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 11.03.2016, 13:00   #13  
vikuss2006 is offline
vikuss2006
Участник
 
42 / 10 (1) +
Регистрация: 22.11.2013
Вот что получилось - во вложении картинка.
Вложения
Тип файла: zip Выписка.zip (29.0 Кб, 141 просмотров)
Старый 11.03.2016, 13:16   #14  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,656 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Ну, собственно, Вы и получили ответ. Com объект автоматически выгружается через несколько минут, если к нему не было обращений. Время простоя. Однако, как видите, если постоянно "дергать" объект, т.е. симулировать некую работу, то объект из памяти не выгружается и к нему можно обратится в любой момент.

Вероятно, пока Excel не закрыт, экземпляр используемого Com-объекта считается "занятым". Поэтому и "висит" неограниченно долго.

Теперь сделайте такую проверку с Excel. Запустите Excel, в нем запустите Com-объект. Затем закройте все экземпляры Excel и дождитесь, пока процесс Com-объекта будет выгружен из памяти. После этого повторно запустите Excel. Ошибка возникнет?
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 11.03.2016, 14:11   #15  
vikuss2006 is offline
vikuss2006
Участник
 
42 / 10 (1) +
Регистрация: 22.11.2013
С таким поведением библиотеки встречаюсь впервые, т.е. с другими библиотеками такого не было, чтобы они выгружались из системы, если я при следующем запуске job пересоздаю ком объект, то по сути уже работаю с новым объектом, поэтому не понятно, причем тут выгрузка старого ком- объекта...
Старый 11.03.2016, 15:06   #16  
terraByteG is offline
terraByteG
Участник
 
15 / 17 (1) ++
Регистрация: 10.03.2016
Владимир Максимов
ИМХО, но Ваш пример не имеет ничего общего с ее вопросом. Ваш пример просто использует этот файл - не обнуляя COM.
По коду видно, что Джоб логинится к файлу, освобождается COM библиотеку вызывающий. Эксель не закрывается. Поэтому повторно прилогиниться к нему не дает - приводит к ошибке.

vikuss2006
Поддерживаю этот вариант:
Цитата:
Теперь сделайте такую проверку с Excel. Запустите Excel, в нем запустите Com-объект. Затем закройте все экземпляры Excel и дождитесь, пока процесс Com-объекта будет выгружен из памяти. После этого повторно запустите Excel. Ошибка возникнет?
Думаю - сработает (выше написал почему).
Старый 11.03.2016, 16:09   #17  
vikuss2006 is offline
vikuss2006
Участник
 
42 / 10 (1) +
Регистрация: 22.11.2013
Я конечно попробую с Эксель, но когда был запущен job, то никаких экселей не было запущено, только Аксапта.
Старый 11.03.2016, 16:15   #18  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,656 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от terraByteG Посмотреть сообщение
Владимир Максимов
ИМХО, но Ваш пример не имеет ничего общего с ее вопросом. Ваш пример просто использует этот файл - не обнуляя COM.
По коду видно, что Джоб логинится к файлу, освобождается COM библиотеку вызывающий. Эксель не закрывается. Поэтому повторно прилогиниться к нему не дает - приводит к ошибке.
Я не в курсе, но разве после того, как макрос Excel завершил свою работу, созданные в этом макросе переменные не освобождаются? Или как организована работа с этим Com-объектом в Excel?

В данном случае, предположительно, происходит не корректная выгрузка объекта из памяти. Какие-то следы остаются. Причем ошибка не Axapta, а именно самого объекта. Вот это и надо проверить перезапустив Excel с этим Com-объектом.
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 11.03.2016, 23:18   #19  
vikuss2006 is offline
vikuss2006
Участник
 
42 / 10 (1) +
Регистрация: 22.11.2013
Результат опыта с Эксель
1) запустила только один экземпляр файла, использующего ком библиотеку. В procexp вижу pid = 2180. Данные получены. Закрываю эксель, в procexp вижу , что библиотека выгрузилась после закрытия файла.
2) запустила опять только один экземпляр файла эксель. Вprocexp вижу pid = 6916. Данные получены, жду и не закрываю файл, библа не выгружается, она выгружается только с закрытием экселя.
3) когда запускаю job в аксапте, то pid процесса всегда одинаковый, независимо от числа запусков job, будто job запускаются в отдельных потоках процесса Аксапты, но это лишь предположение.
Старый 14.03.2016, 08:33   #20  
terraByteG is offline
terraByteG
Участник
 
15 / 17 (1) ++
Регистрация: 10.03.2016
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Я не в курсе, но разве после того, как макрос Excel завершил свою работу, созданные в этом макросе переменные не освобождаются? Или как организована работа с этим Com-объектом в Excel?
Как там внутри устроено - науке не известно. Как я понял, авторы заверяют - что у них все отрабатывает на 100%, а значит проблемы индейцев шерифа не волнуют.

Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
В данном случае, предположительно, происходит не корректная выгрузка объекта из памяти. Какие-то следы остаются. Причем ошибка не Axapta, а именно самого объекта. Вот это и надо проверить перезапустив Excel с этим Com-объектом.
Поддерживаю. Самое забавное, что в библиотеке отсутствует метод завершения всего этого действа (или нет, например, Close()?). Хотя бы handle возвращал, можно было бы аварийно excel бахать.
Теги
com connector, com-объект, thread

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
axmfg: Lean manufacturing: Picking activities and kanban line events Blog bot DAX Blogs 0 26.08.2014 21:13
atinkerersnotebook: Using Vendor Requests to Manage On-boarding New Vendors Blog bot DAX Blogs 1 22.10.2013 02:24
atinkerersnotebook: Using Service Management to Track Service Orders Blog bot DAX Blogs 1 25.08.2013 19:16
atinkerersnotebook: Configuring Lean Manufacturing in Dynamics AX 2012 Blog bot DAX Blogs 1 12.08.2013 00:15
dynamicsaxtraining: Vendor returns Blog bot DAX Blogs 0 11.10.2012 00:11

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 21:15.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.