14.03.2016, 15:39 | #21 |
Участник
|
Никакого закрытия в библиотеке нет, только Login и получение данных, к сожалению
Последний раз редактировалось vikuss2006; 14.03.2016 в 15:55. |
|
14.03.2016, 17:30 | #22 |
Участник
|
Цитата:
PS: Кстати, на какой команде в Axapta обращения к COM возникает ошибка?
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
15.03.2016, 12:27 | #23 |
Участник
|
вот скрипт
Sub test() ' Поправьте эти значения, указав логин, пароль, пароль к секретному ключу и путь к секретному ключу пользователя Login = Range("Login").Value '"ALGOL1" pwd1 = Range("Pwd_1").Value '"900" pwd2 = Range("Pwd_2").Value '"900" pathToKey = Range("Path").Value '"c:\Keys\ALGOL1_" Dim o As iFOBSDocIntegrator.DocOperation Set o = New iFOBSDocIntegrator.DocOperation If (o Is Nothing) Then MsgBox "Ошибка! iFOBSDocIntegrator.dll не зарегистрирована в системе." GoTo Exit1 End If MsgBox "Проверка параметров Login." s = o.Login(Login, pwd1, pwd2, pathToKey) If s <> "" Then MsgBox "Ошибка! Неправильно определены данные" GoTo Exit1 End If MsgBox "Получение списка архивных документов за период" Call testGetDocInfoList(o) MsgBox "Получение списка документов, ожидающих первой подписи" Call testGetDocList(o, DOC_WAIT_SIGN1) MsgBox "Получение списка документов, ожидающих второй подписи" Call testGetDocList(o, DOC_WAIT_SIGN2) MsgBox "Получение списка документов, ожидающих третьей подписи" Call testGetDocList(o, DOC_WAIT_AUTH) MsgBox "Получение списка всех введенных документов за период" Call testGetDocList(o, DOC_ALL_DOCUMENTS) Exit1: Set o = Nothing End Sub Аксапта вылетает при получении списка через опеределенное время, при очередном запуске job |
|
15.03.2016, 19:57 | #24 |
Участник
|
Если обернуть вызов в ComDispFunction() не поможет?
X++: static void test_Com(Args _args) { Com comApplication; str ret; str s; ComDispFunction funcGet; COMVariant varArgStr1; COMVariant varArgStr2; COMVariant varArgStr3; COMVariant varArgStr4; ComVariant varRet; ; try { comApplication = new COM("iDocIntegrator.DocOperation"); if(!comApplication) { info("error"); return; } // Вместо прямого вызова, сделать вызов через ComDispFunction //ret = comApplication.Login("login", "pass", "pass", "D:\key"); // Функция funcGet = new ComDispFunction(comApplication, "Login", COMDispContext::PropertyGet); // Параметры varArgStr1 = COMVariant::createFromStr("login"); varArgStr2 = COMVariant::createFromStr("pass"); varArgStr3 = COMVariant::createFromStr("pass"); varArgStr4 = COMVariant::createFromStr("D:\key"); // Возвращаемое значение varRet = new COMVariant(COMVariantInOut::OUT_RETVAL, COMVariantType::VT_BSTR); // Выполнение funcGet.call(varArgStr1, varArgStr2, varArgStr3, varArgStr4, varRet); // Результат выполнения ret = varRet.bStr(); if(!ret) { // Вместо прямого вызова, сделать вызов через ComDispFunction //s = comApplication.GetDocInfoList("20160218", "20160218"); // Функция funcGet = new ComDispFunction(comApplication, "GetDocInfoList", COMDispContext::PropertyGet); // Параметры varArgStr1 = COMVariant::createFromStr("20160218"); varArgStr2 = COMVariant::createFromStr("20160218"); // Возвращаемое значение varRet = new COMVariant(COMVariantInOut::OUT_RETVAL, COMVariantType::VT_BSTR); // Выполнение funcGet.call(varArgStr1, varArgStr2, varRet); // Результат выполнения s = varRet.bStr(); info(s); } else { info(ret); } comApplication = null; } catch(Exception::Error) { comApplication = null; throw error("Обработка отменена!"); } comApplication = null; info('end'); }
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
16.03.2016, 09:45 | #25 |
Участник
|
Цитата:
*добавлено: Как отработает вот такой скрипт? X++: Sub test() ' Поправьте эти значения, указав логин, пароль, пароль к секретному ключу и путь к секретному ключу пользователя Login = Range("Login").Value '"ALGOL1" pwd1 = Range("Pwd_1").Value '"900" pwd2 = Range("Pwd_2").Value '"900" pathToKey = Range("Path").Value '"c:\Keys\ALGOL1_" Dim o As iFOBSDocIntegrator.DocOperation Set o = New iFOBSDocIntegrator.DocOperation If (o Is Nothing) Then MsgBox "Ошибка! iFOBSDocIntegrator.dll не зарегистрирована в системе." GoTo Exit1 End If MsgBox "Проверка параметров Login." s = o.Login(Login, pwd1, pwd2, pathToKey) If s <> "" Then MsgBox "Ошибка! Неправильно определены данные" GoTo Exit1 End If MsgBox "Получение списка архивных документов за период" Call testGetDocInfoList(o) Exit1: Set o = Nothing End Sub Все это оставляет ощущения быдлоразработчиков (отмахнулись, мол скрипт наш работает, а остальное Ваши проблемы)... Последний раз редактировалось terraByteG; 16.03.2016 в 10:10. |
|
16.03.2016, 09:59 | #26 |
Участник
|
|
|
16.03.2016, 10:18 | #27 |
Участник
|
Имя переменных. Конечно это придирки, но отдавать это клиентам, не желая потратить 2 секунды и придерживаться правил хорошего тона, чтобы не стыдно было. А то сделали на отъе***
Это мое ИМХО. Предположу, что даже не задумывались, для возможности удобного и безошибочного использования клиентами их библиотеки, положить в нее не только вход, но и выход. На все ответят скриптом... Когда писал свою выгрузку из Аксапты в Эксель, вторым что я сделал после инициализации документа - метод CloseDocument(). |
|
17.03.2016, 12:56 | #28 |
Участник
|
Цитата:
Сообщение от Владимир Максимов
Если обернуть вызов в ComDispFunction() не поможет?
X++: static void test_Com(Args _args) { Com comApplication; str ret; str s; ComDispFunction funcGet; COMVariant varArgStr1; COMVariant varArgStr2; COMVariant varArgStr3; COMVariant varArgStr4; ComVariant varRet; ; try { comApplication = new COM("iDocIntegrator.DocOperation"); if(!comApplication) { info("error"); return; } // Вместо прямого вызова, сделать вызов через ComDispFunction //ret = comApplication.Login("login", "pass", "pass", "D:\key"); // Функция funcGet = new ComDispFunction(comApplication, "Login", COMDispContext::PropertyGet); // Параметры varArgStr1 = COMVariant::createFromStr("login"); varArgStr2 = COMVariant::createFromStr("pass"); varArgStr3 = COMVariant::createFromStr("pass"); varArgStr4 = COMVariant::createFromStr("D:\key"); // Возвращаемое значение varRet = new COMVariant(COMVariantInOut::OUT_RETVAL, COMVariantType::VT_BSTR); // Выполнение funcGet.call(varArgStr1, varArgStr2, varArgStr3, varArgStr4, varRet); // Результат выполнения ret = varRet.bStr(); if(!ret) { // Вместо прямого вызова, сделать вызов через ComDispFunction //s = comApplication.GetDocInfoList("20160218", "20160218"); // Функция funcGet = new ComDispFunction(comApplication, "GetDocInfoList", COMDispContext::PropertyGet); // Параметры varArgStr1 = COMVariant::createFromStr("20160218"); varArgStr2 = COMVariant::createFromStr("20160218"); // Возвращаемое значение varRet = new COMVariant(COMVariantInOut::OUT_RETVAL, COMVariantType::VT_BSTR); // Выполнение funcGet.call(varArgStr1, varArgStr2, varRet); // Результат выполнения s = varRet.bStr(); info(s); } else { info(ret); } comApplication = null; } catch(Exception::Error) { comApplication = null; throw error("Обработка отменена!"); } comApplication = null; info('end'); } <?xml version="1.0" encoding="windows-1251"?><ERROR>Access violation at address 1105C5CF in module 'libeay32.dll'. Write of address 0889E338</ERROR> |
|
18.03.2016, 16:04 | #29 |
Участник
|
Цитата:
И еще, думаю, не принципиально, но все-таки, первой командой в примере Excel идет выборка списка документов. X++: MsgBox "Получение списка архивных документов за период"
Call testGetDocInfoList(o) X++: XML xml; (...) xml = comApplication.GetDocInfoList() info(xml) Set o = Nothing
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
21.03.2016, 10:43 | #30 |
Участник
|
Цитата:
Сообщение от Владимир Максимов
А Вы не могли бы на время тестирования отключить антивирус, если он у Вас есть? Может быть, он блокирует библиотеку?
И еще, думаю, не принципиально, но все-таки, первой командой в примере Excel идет выборка списка документов. X++: MsgBox "Получение списка архивных документов за период"
Call testGetDocInfoList(o) X++: XML xml; (...) xml = comApplication.GetDocInfoList() info(xml) Set o = Nothing Метод 'GetDocInfoList' в COM-объекте класса '{A6103CA4-D33A-48A5-BB08-7893A12BE5D8}' возвратил код ошибки 0x8000FFFF (<неизвестно>), который означает: Вы не вошли в систему!. |
|
21.03.2016, 10:48 | #31 |
Участник
|
И еще, у разработчиков я узнавала, почему библиотека выгружается из памяти, ничего не ответили, единственное, что сказали, и то не разработчики,а техническая поддержка банка, что они не знают, как будет вести себя библиотека при одновременных запусках.
|
|
21.03.2016, 17:58 | #32 |
Участник
|
может стоит попробовать Thread t = new Thread();
|
|
22.03.2016, 15:45 | #33 |
Участник
|
Попробовала создать новый поток, чтобы выполнить подключение библиотеки в отдельном потоке,
t = new Thread(); //t.removeOnComplete(true); t.run(classnum(FCH_ThreadDemo), identifierstr(run)); Аксапта ругается Ошибка времени выполнения xApplication(Объект), метод initGlobal вызван с неправильными параметрами, хотя я использую учебный пример Аксапты по работе с потоками TutorialThread. |
|
23.03.2016, 08:39 | #34 |
Участник
|
Так понимаю, что run - не объявлен как статический...
X++: t = new Thread(); //t.removeOnComplete(true); t.run(classnum(FCH_ThreadDemo), staticmethodstr(FCH_ThreadDemo, run)); |
|
23.03.2016, 08:53 | #35 |
Участник
|
Цитата:
{ } static client void main() { Thread t; ; t = new Thread(); //t.removeOnComplete(true); t.run(classnum(FCH_ThreadDemo), staticmethodstr(FCH_ThreadDemo, run)); } static client void run(Thread t) { ; //sleep(2000); info("hello"); } вызов FCH_ThreadDemo::main(); |
|
23.03.2016, 10:10 | #36 |
Участник
|
По-моему в тройке были какие-то проблемы с использованием infologa в потоке.
Threads Попробуйте без интерактивных функций Вывести сообщение сгенерированное в отдельном потоке (thread) в окно инфо? |
|
23.03.2016, 10:18 | #37 |
Участник
|
X++: class FCH_ThreadDemo { } static client void main(Args args) { Thread t; container con; ; t = new Thread(); t.run(classnum(FCH_ThreadDemo), staticmethodstr(FCH_ThreadDemo, run)); sleep(500); info(conPeek(t.getOutputParm(), 1)); t.removeOnComplete(true); } static client void run(Thread t) { t.setOutputParm(['Hello']); } |
|
23.03.2016, 10:25 | #38 |
Участник
|
|
|
23.03.2016, 10:27 | #39 |
Участник
|
Цитата:
Сообщение от S.Kuskov
По-моему в тройке были какие-то проблемы с использованием infologa в потоке.
Threads Попробуйте без интерактивных функций Вывести сообщение сгенерированное в отдельном потоке (thread) в окно инфо? static client void run(Thread t) { int i = 1; ; i++; } Но самое интересное, что в run() ставлю точку останова, и туда вообще не попадаю. |
|
23.03.2016, 10:36 | #40 |
Участник
|
Цитата:
Сообщение от terraByteG
X++: class FCH_ThreadDemo { } static client void main(Args args) { Thread t; container con; ; t = new Thread(); t.run(classnum(FCH_ThreadDemo), staticmethodstr(FCH_ThreadDemo, run)); sleep(500); info(conPeek(t.getOutputParm(), 1)); t.removeOnComplete(true); } static client void run(Thread t) { t.setOutputParm(['Hello']); } |
|
Теги |
com connector, com-объект, thread |
|
|