25.04.2017, 11:55 | #1 |
Участник
|
Не отрабатывает DLL из джоба, в дебагере отрабатывает
Добрый день. Есть необходимость обрабатывать файлы с электронной подписью, речь идёт о системе электронного документооборота ECOM, в частности о файле приходной накладной с электронной подписью "COMDOC". Файл на котором наложена ЭЦП имеет расширение .p7s.
Для снятия электронно подписи используется DLL. После выполнения метода библиотеки, создаётся файл с расширением .txt и имеющим структуру XML. Такой вопрос, когда запускается код снимающий ЭЦП в джобе без точек останова. Файл .txt не создаётся, если же поставить точку останова и пройти код по шагам, создаётся .txt файл.Может кто сталкивался с такой ситуацией? Пробовал ставить sleep() - не помогает. Ниже сам джоб. X++: static void Job709(Args _args) { Library library; ComVariant cv = new ComVariant(); ; cv.bStr(@'\\путь\к\файлу.p7s'); library = new Library(); library.Initialize("UA1"); library.SetUIMode(false); if(library.IsLibraryInitialized()) { library.UnprotectFiles(cv,false); } library.Finalize(); } |
|
25.04.2017, 13:35 | #2 |
Участник
|
А как джоб запускаете? Через menuitem? Не может быть такого что при отладке джоб запускается на клиентской стороне, а без отладки на серверной или наоборот?
|
|
25.04.2017, 14:18 | #3 |
Участник
|
А разве не так надо строку со слэшами передавать: два слэша вместо одного?
X++: cv.bStr(@'\\\\путь\\к\\файлу.p7s'); Последний раз редактировалось Ace of Database; 25.04.2017 в 14:21. |
|
25.04.2017, 14:22 | #4 |
Участник
|
Джоб запускаю в АОТе
|
|
25.04.2017, 18:47 | #5 |
Участник
|
а заассертить пермишены нинада? (если код на сервере исполняется)
try.. catch блок добавьте и в эксепшене увидите, почему не работает Последний раз редактировалось lvan; 25.04.2017 в 18:55. |
|
26.04.2017, 09:49 | #6 |
Участник
|
Цитата:
Пробовал ставить sleep() - не помогает.
Читайте описание методов, если есть. Ищите методы, которые позволяют определить, что асинхронный вызов завершился... или ставьте sleep перед каждым вызовом с заведомо большой задержкой... может и выявите метод и сколько надо ждать (хотя это кривовато). |
|
26.04.2017, 11:07 | #7 |
Участник
|
Цитата:
Сообщение от ansoft
Думаю, что если под отладчиком работает, а иначе - нет, то все же возможно, что методы в DLL асинхронные, а значит в отладчике хватает времени между шагами на то, чтобы такой метод отработал... соответственно не в отладчике - времени не хватает.
Читайте описание методов, если есть. Ищите методы, которые позволяют определить, что асинхронный вызов завершился... или ставьте sleep перед каждым вызовом с заведомо большой задержкой... может и выявите метод и сколько надо ждать (хотя это кривовато). X++: if(library.IsLibraryInitialized()) { sleep(5000); library.UnprotectFiles(cv,true); } info(library.GetLastErrorDescription()); sleep(5000); library.Finalize(); ставлю точку останова на метод снятия подписи library.UnprotectFiles(cv,true); нажимаю step over(Shift+F8) и файл создаётся. |
|
26.04.2017, 11:07 | #8 |
Участник
|
lvan, в catch не попадает, у библиотеки есть метод возвращающий описание ошибки. В результате выполнения джоба, этот метод возвращает значение "Выполнено успешно" )). Забыл сказать, Axapta 3.0.
|
|
26.04.2017, 11:34 | #9 |
Участник
|
sleep() надо ставить "после", а не "до" метода, который создает файл. А вообще, сделайте зацикливание с проверкой факта существования файла. Ну, и выход, если совсем уже долго будет висеть. Ну, как-то так
X++: static void Job709(Args _args) { Library library; FileName fileName; ComVariant cv; int i; ; fileName = @'\\путь\к\файлу.p7s'; cv = ComVariant::createFromStr(fileName); library = new Library(); library.Initialize("UA1"); library.SetUIMode(false); if (library.IsLibraryInitialized()) { library.UnprotectFiles(cv,false); for (i = 1; (i <= 10 && !winAPI::fileExists_RU(fileName)); i++) { sleep(5000); } } library.Finalize(); if (i > 10) { info('No'); } else { info('Yes'); } }
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
26.04.2017, 11:53 | #10 |
Участник
|
|
|
26.04.2017, 11:58 | #11 |
Участник
|
Цитата:
Сообщение от Владимир Максимов
sleep() надо ставить "после", а не "до" метода, который создает файл. А вообще, сделайте зацикливание с проверкой факта существования файла. Ну, и выход, если совсем уже долго будет висеть. Ну, как-то так
X++: static void Job709(Args _args) { Library library; FileName fileName; ComVariant cv; int i; ; fileName = @'\\путь\к\файлу.p7s'; cv = ComVariant::createFromStr(fileName); library = new Library(); library.Initialize("UA1"); library.SetUIMode(false); if (library.IsLibraryInitialized()) { library.UnprotectFiles(cv,false); for (i = 1; (i <= 10 && !winAPI::fileExists_RU(fileName)); i++) { sleep(5000); } } library.Finalize(); if (i > 10) { info('No'); } else { info('Yes'); } } |
|
26.04.2017, 11:59 | #12 |
Участник
|
|
|
26.04.2017, 12:18 | #13 |
Участник
|
А если вы вызовы этого компонента запишете в каком нить скриптовом файле (vbs, и.т.п) и руками запустите без аксапты, то работает ?
Если так, то как обходной маневр можно создавать в темпе файл скрипта и из аксапты запускать на выполнение. Изврат конечно, но что делать. |
|
26.04.2017, 13:57 | #14 |
Участник
|
А дальше ещё интереснее. Ставлю точку останова, сразу убираю и запускаю джоб, библиотека отрабатывает и создаёт новый файл, при повторном запуске джоба, не отрабатывает, опять ставлю точку останова, запускаю - файл создаётся.
Убрал из джоба library.Finalize(); |
|
26.04.2017, 14:46 | #15 |
Участник
|
Если у вас AX2012, то попробуйте так:
X++: static void Job709(Args _args) { Library library; ComVariant cv = new ComVariant(); ; #StartSafeCall_RU { cv.bStr(@'\\путь\к\файлу.p7s'); library = new Library(); library.Initialize("UA1"); library.SetUIMode(false); if(library.IsLibraryInitialized()) { library.UnprotectFiles(cv,false); } library.Finalize(); } #EndSafeCall_RU } Последний раз редактировалось Ace of Database; 26.04.2017 в 14:49. |
|
26.04.2017, 15:43 | #16 |
Участник
|
|
|
26.04.2017, 16:07 | #17 |
Участник
|
Цитата:
library.UnprotectFiles(cv,true);
Цитата:
library.UnprotectFiles(cv,false);
Что сей параметр означает? Не влияет на создание файла? |
|
26.04.2017, 16:45 | #18 |
Участник
|
|
|
26.04.2017, 18:13 | #19 |
Участник
|
Когда то давно в прошлой жизни и в другой системе реализовывали подпись и ее снятие с файлов, так вот чего то не получилось у программистов. Объяснили это особенностями работы криптографической библиотеки с памятью. Записи в таблице подписывали и снимали с них подпись без проблем, а вот файл так и не дался, в итоге реализовали через вызовы батников. Но там была Верба, у вас другое...
|
|
27.04.2017, 10:15 | #20 |
Участник
|
А если так?
Если есть желание, попробуйте совместить идею с ожиданием результата с многократным вызовом
Код: sleep(5000); if (library.IsLibraryInitialized()) { for (i = 1; (i <= 10 && !winAPI::fileExists_RU(fileName)); i++) { library.UnprotectFiles(cv,false); sleep(5000); info(library.GetLastErrorDescription()); } } Возможно при вызове UnprotectFiles происходит ошибка и повторный вызов поможет? |
|
Теги |
comdoc, dll, ecom, эцп |
|
|