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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 25.04.2017, 11:55   #1  
MaksNeskor is offline
MaksNeskor
Участник
 
14 / 10 (1) +
Регистрация: 19.02.2015
Адрес: Ukraine
Не отрабатывает 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  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
А как джоб запускаете? Через menuitem? Не может быть такого что при отладке джоб запускается на клиентской стороне, а без отладки на серверной или наоборот?
Старый 25.04.2017, 14:18   #3  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
877 / 649 (23) +++++++
Регистрация: 14.10.2004
А разве не так надо строку со слэшами передавать: два слэша вместо одного?
X++:
cv.bStr(@'\\\\путь\\к\\файлу.p7s');
update: извините, вопрос снимается, символ @ экранирует слэши

Последний раз редактировалось Ace of Database; 25.04.2017 в 14:21.
Старый 25.04.2017, 14:22   #4  
MaksNeskor is offline
MaksNeskor
Участник
 
14 / 10 (1) +
Регистрация: 19.02.2015
Адрес: Ukraine
Джоб запускаю в АОТе
Старый 25.04.2017, 18:47   #5  
lvan is offline
lvan
Участник
Аватар для lvan
Лучший по профессии 2014
 
858 / 82 (4) ++++
Регистрация: 15.04.2011
Записей в блоге: 1
а заассертить пермишены нинада? (если код на сервере исполняется)

try.. catch блок добавьте и в эксепшене увидите, почему не работает

Последний раз редактировалось lvan; 25.04.2017 в 18:55.
Старый 26.04.2017, 09:49   #6  
ansoft is offline
ansoft
Участник
Аватар для ansoft
 
123 / 37 (2) +++
Регистрация: 20.10.2005
:)
Цитата:
Пробовал ставить sleep() - не помогает.
Думаю, что если под отладчиком работает, а иначе - нет, то все же возможно, что методы в DLL асинхронные, а значит в отладчике хватает времени между шагами на то, чтобы такой метод отработал... соответственно не в отладчике - времени не хватает.

Читайте описание методов, если есть. Ищите методы, которые позволяют определить, что асинхронный вызов завершился... или ставьте sleep перед каждым вызовом с заведомо большой задержкой... может и выявите метод и сколько надо ждать (хотя это кривовато).
Старый 26.04.2017, 11:07   #7  
MaksNeskor is offline
MaksNeskor
Участник
 
14 / 10 (1) +
Регистрация: 19.02.2015
Адрес: Ukraine
Цитата:
Сообщение от 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  
MaksNeskor is offline
MaksNeskor
Участник
 
14 / 10 (1) +
Регистрация: 19.02.2015
Адрес: Ukraine
Цитата:
Сообщение от lvan Посмотреть сообщение
а заассертить пермишены нинада? (если код на сервере исполняется)

try.. catch блок добавьте и в эксепшене увидите, почему не работает
lvan, в catch не попадает, у библиотеки есть метод возвращающий описание ошибки. В результате выполнения джоба, этот метод возвращает значение "Выполнено успешно" )). Забыл сказать, Axapta 3.0.
Старый 26.04.2017, 11:34   #9  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
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  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от MaksNeskor Посмотреть сообщение
ставлю точку останова на метод снятия подписи
library.UnprotectFiles(cv,true);
нажимаю step over(Shift+F8)
и файл создаётся.
Поставьте точку останова после library.Finalize(), а до не ставьте.
Чтобы убедится что дело не в самой отладке а именно в ожидании.
Старый 26.04.2017, 11:58   #11  
MaksNeskor is offline
MaksNeskor
Участник
 
14 / 10 (1) +
Регистрация: 19.02.2015
Адрес: Ukraine
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
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');
    }

}
Результат выполнения "NO". Должен создаться ещё один файл с расширением .txt. Я джобик подправил.
Старый 26.04.2017, 11:59   #12  
MaksNeskor is offline
MaksNeskor
Участник
 
14 / 10 (1) +
Регистрация: 19.02.2015
Адрес: Ukraine
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Поставьте точку останова после library.Finalize(), а до не ставьте.
Чтобы убедится что дело не в самой отладке а именно в ожидании.
Да, файл не создался.
Старый 26.04.2017, 12:18   #13  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,952 / 3230 (115) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
А если вы вызовы этого компонента запишете в каком нить скриптовом файле (vbs, и.т.п) и руками запустите без аксапты, то работает ?
Если так, то как обходной маневр можно создавать в темпе файл скрипта и из аксапты запускать на выполнение.

Изврат конечно, но что делать.
Старый 26.04.2017, 13:57   #14  
MaksNeskor is offline
MaksNeskor
Участник
 
14 / 10 (1) +
Регистрация: 19.02.2015
Адрес: Ukraine
А дальше ещё интереснее. Ставлю точку останова, сразу убираю и запускаю джоб, библиотека отрабатывает и создаёт новый файл, при повторном запуске джоба, не отрабатывает, опять ставлю точку останова, запускаю - файл создаётся.

Убрал из джоба library.Finalize();
Старый 26.04.2017, 14:46   #15  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
877 / 649 (23) +++++++
Регистрация: 14.10.2004
Если у вас 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
}
А вообще, как предложил Logger, можно через скрипт VBS вызывать.

Последний раз редактировалось Ace of Database; 26.04.2017 в 14:49.
Старый 26.04.2017, 15:43   #16  
MaksNeskor is offline
MaksNeskor
Участник
 
14 / 10 (1) +
Регистрация: 19.02.2015
Адрес: Ukraine
Цитата:
Сообщение от Ace of Database Посмотреть сообщение
Если у вас AX2012, то попробуйте так:
У нас Axapta 3.0
Старый 26.04.2017, 16:07   #17  
ansoft is offline
ansoft
Участник
Аватар для ansoft
 
123 / 37 (2) +++
Регистрация: 20.10.2005
Цитата:
library.UnprotectFiles(cv,true);
Цитата:
library.UnprotectFiles(cv,false);
Странно, но у вас второй параметр меняется... как раз в листинге, где задержку тестируете. А там где в отладчике - иначе.
Что сей параметр означает? Не влияет на создание файла?
Старый 26.04.2017, 16:45   #18  
MaksNeskor is offline
MaksNeskor
Участник
 
14 / 10 (1) +
Регистрация: 19.02.2015
Адрес: Ukraine
Цитата:
Сообщение от ansoft Посмотреть сообщение
Странно, но у вас второй параметр меняется... как раз в листинге, где задержку тестируете. А там где в отладчике - иначе.
Что сей параметр означает? Не влияет на создание файла?
Этот параметр не влияет на результат выполнения.
Старый 26.04.2017, 18:13   #19  
potential is offline
potential
Участник
 
84 / 35 (2) +++
Регистрация: 13.04.2012
Адрес: Санкт-Петербург
Когда то давно в прошлой жизни и в другой системе реализовывали подпись и ее снятие с файлов, так вот чего то не получилось у программистов. Объяснили это особенностями работы криптографической библиотеки с памятью. Записи в таблице подписывали и снимали с них подпись без проблем, а вот файл так и не дался, в итоге реализовали через вызовы батников. Но там была Верба, у вас другое...
Старый 27.04.2017, 10:15   #20  
ansoft is offline
ansoft
Участник
Аватар для ansoft
 
123 / 37 (2) +++
Регистрация: 20.10.2005
:) А если так?
Если есть желание, попробуйте совместить идею с ожиданием результата с многократным вызовом
Код:
    sleep(5000);

    if (library.IsLibraryInitialized())
    {
        for (i = 1; (i <= 10 && !winAPI::fileExists_RU(fileName)); i++)
        {
            library.UnprotectFiles(cv,false);
            sleep(5000);
	    info(library.GetLastErrorDescription());
        }
    }
Подобные вещи иногда помогают при работе с Excel... он часто любит вылетать при обращении к листу и иногда такой вызов можно обложить try catch retry n times.
Возможно при вызове UnprotectFiles происходит ошибка и повторный вызов поможет?
Теги
comdoc, dll, ecom, эцп

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
palleagermark: Creating code for a dll that might or might not be on the system Blog bot DAX Blogs 0 07.01.2016 11:11
Ax3 and Win2008 для печати Arahnid DAX: Администрирование 13 22.04.2013 17:07
MSDAX 4.0 и планировщик win server 2008 werov2010 DAX: Администрирование 11 16.08.2012 14:18
Client Axapta 3.0 SP4 и Linux. Как запустить? Daiver DAX: Администрирование 10 28.06.2007 15:59
при вызове функции из своей DLL, вылетает ошибка Delfins DAX: Программирование 9 07.03.2006 19:29
Опции темы Поиск в этой теме
Поиск в этой теме:

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

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

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

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