06.03.2016, 20:00 | #1 |
Участник
|
Проблема подключения 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 |
Участник
|
|
|
07.03.2016, 11:01 | #3 |
Участник
|
Finalize уже применяла, ошибка осталась, к сожалению!
|
|
09.03.2016, 12:46 | #4 |
Участник
|
Попробуйте переписать в виде vb-скрипта и сохраните скрипт в текстовом файле с расширением .vbs.
X++: Set COMApplication = CreateObject("iDocIntegrator.DocOperation") COMApplication.Login "login", "pass", "pass", "D:\key" s = COMApplication.GetDocInfoList("20160218", "20160218") MsgBox s PHP код:
|
|
09.03.2016, 13:50 | #5 |
Участник
|
Скорее всего в самом скрипте есть ошибки, не запускается пока что.Неужели только через скрипт можно работать с этой библиотекой.
|
|
09.03.2016, 15:21 | #6 |
Участник
|
Попробуйте через COM + в Windows настроить данный COM-объект. Я уже давно так не делал, поэтому подробностей не помню.
Или возьмите у разработчиков скрипт, который они тестировали в Excel и перепишите его в файл как VBS-скрипт |
|
09.03.2016, 16:14 | #7 |
Участник
|
Цитата:
Сообщение от vikuss2006
в программе "procexp" видно как dll загружена при запуске джобика, но через несколько минут в том же "procexp" видно, что dll сама по себе выгружается из памяти, после чего Аксапта при следующем запуске джобика начинает ругаться Access violation 0х0000000, а при дальнейших запусках джобика Аксапта вообще закрывается.
(...) Вместе с библиотекой в комплекте шел пример Excel, который успешно применяет данную библиотеку, без ошибок. Для Axapta выгрузка процесса происходит через 5 минут простоя (когда в Axapta ничего не грузится) или может оборвать соединение прямо в процессе загрузки данных? Или в этот момент в Axapta выполнялась какая-то другая обработка?
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
09.03.2016, 18:13 | #8 |
Участник
|
никаких обработок в Аксапте не было, т.е. выполнился job, затем просто жду, ничего не делаю я в своей сессии, потом снова запускаю job и ошибка.
|
|
09.03.2016, 20:41 | #9 |
Участник
|
Для Excel также? Или процесс висит бесконечно?
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
10.03.2016, 08:56 | #10 |
Участник
|
для Excel процесс висит бесконечно, да, только из Аксапты вылетает.
|
|
10.03.2016, 12:29 | #11 |
Участник
|
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 |
Участник
|
Запустите следующий 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 |
Участник
|
Вот что получилось - во вложении картинка.
|
|
11.03.2016, 13:16 | #14 |
Участник
|
Ну, собственно, Вы и получили ответ. Com объект автоматически выгружается через несколько минут, если к нему не было обращений. Время простоя. Однако, как видите, если постоянно "дергать" объект, т.е. симулировать некую работу, то объект из памяти не выгружается и к нему можно обратится в любой момент.
Вероятно, пока Excel не закрыт, экземпляр используемого Com-объекта считается "занятым". Поэтому и "висит" неограниченно долго. Теперь сделайте такую проверку с Excel. Запустите Excel, в нем запустите Com-объект. Затем закройте все экземпляры Excel и дождитесь, пока процесс Com-объекта будет выгружен из памяти. После этого повторно запустите Excel. Ошибка возникнет?
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
11.03.2016, 14:11 | #15 |
Участник
|
С таким поведением библиотеки встречаюсь впервые, т.е. с другими библиотеками такого не было, чтобы они выгружались из системы, если я при следующем запуске job пересоздаю ком объект, то по сути уже работаю с новым объектом, поэтому не понятно, причем тут выгрузка старого ком- объекта...
|
|
11.03.2016, 15:06 | #16 |
Участник
|
Владимир Максимов
ИМХО, но Ваш пример не имеет ничего общего с ее вопросом. Ваш пример просто использует этот файл - не обнуляя COM. По коду видно, что Джоб логинится к файлу, освобождается COM библиотеку вызывающий. Эксель не закрывается. Поэтому повторно прилогиниться к нему не дает - приводит к ошибке. vikuss2006 Поддерживаю этот вариант: Цитата:
Теперь сделайте такую проверку с Excel. Запустите Excel, в нем запустите Com-объект. Затем закройте все экземпляры Excel и дождитесь, пока процесс Com-объекта будет выгружен из памяти. После этого повторно запустите Excel. Ошибка возникнет?
|
|
11.03.2016, 16:09 | #17 |
Участник
|
Я конечно попробую с Эксель, но когда был запущен job, то никаких экселей не было запущено, только Аксапта.
|
|
11.03.2016, 16:15 | #18 |
Участник
|
Цитата:
Сообщение от terraByteG
Владимир Максимов
ИМХО, но Ваш пример не имеет ничего общего с ее вопросом. Ваш пример просто использует этот файл - не обнуляя COM. По коду видно, что Джоб логинится к файлу, освобождается COM библиотеку вызывающий. Эксель не закрывается. Поэтому повторно прилогиниться к нему не дает - приводит к ошибке. В данном случае, предположительно, происходит не корректная выгрузка объекта из памяти. Какие-то следы остаются. Причем ошибка не Axapta, а именно самого объекта. Вот это и надо проверить перезапустив Excel с этим Com-объектом.
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
11.03.2016, 23:18 | #19 |
Участник
|
Результат опыта с Эксель
1) запустила только один экземпляр файла, использующего ком библиотеку. В procexp вижу pid = 2180. Данные получены. Закрываю эксель, в procexp вижу , что библиотека выгрузилась после закрытия файла. 2) запустила опять только один экземпляр файла эксель. Вprocexp вижу pid = 6916. Данные получены, жду и не закрываю файл, библа не выгружается, она выгружается только с закрытием экселя. 3) когда запускаю job в аксапте, то pid процесса всегда одинаковый, независимо от числа запусков job, будто job запускаются в отдельных потоках процесса Аксапты, но это лишь предположение. |
|
14.03.2016, 08:33 | #20 |
Участник
|
Цитата:
Поддерживаю. Самое забавное, что в библиотеке отсутствует метод завершения всего этого действа (или нет, например, Close()?). Хотя бы handle возвращал, можно было бы аварийно excel бахать. |
|
Теги |
com connector, com-объект, thread |
|
|