|
![]() |
#1 |
Участник
|
Цитата:
Поддерживаю. Самое забавное, что в библиотеке отсутствует метод завершения всего этого действа (или нет, например, Close()?). Хотя бы handle возвращал, можно было бы аварийно excel бахать. |
|
![]() |
#2 |
Участник
|
Никакого закрытия в библиотеке нет, только Login и получение данных, к сожалению
Последний раз редактировалось vikuss2006; 14.03.2016 в 15:55. |
|
![]() |
#3 |
Участник
|
Если обернуть вызов в 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'); }
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
![]() |
#4 |
Участник
|
Цитата:
Сообщение от Владимир Максимов
![]() Если обернуть вызов в 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> |
|
![]() |
#5 |
Участник
|
Цитата:
И еще, думаю, не принципиально, но все-таки, первой командой в примере Excel идет выборка списка документов. X++: MsgBox "Получение списка архивных документов за период"
Call testGetDocInfoList(o) X++: XML xml; (...) xml = comApplication.GetDocInfoList() info(xml) Set o = Nothing
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
![]() |
#6 |
Участник
|
Цитата:
Сообщение от Владимир Максимов
![]() А Вы не могли бы на время тестирования отключить антивирус, если он у Вас есть? Может быть, он блокирует библиотеку?
И еще, думаю, не принципиально, но все-таки, первой командой в примере 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 (<неизвестно>), который означает: Вы не вошли в систему!. |
|
![]() |
#7 |
Участник
|
И еще, у разработчиков я узнавала, почему библиотека выгружается из памяти, ничего не ответили, единственное, что сказали, и то не разработчики,а техническая поддержка банка, что они не знают, как будет вести себя библиотека при одновременных запусках.
|
|
![]() |
#8 |
Участник
|
Так понимаю, что run - не объявлен как статический...
X++: t = new Thread(); //t.removeOnComplete(true); t.run(classnum(FCH_ThreadDemo), staticmethodstr(FCH_ThreadDemo, run)); |
|
![]() |
#9 |
Участник
|
Цитата:
{ } 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(); |
|
![]() |
#10 |
Участник
|
По-моему в тройке были какие-то проблемы с использованием infologa в потоке.
Threads Попробуйте без интерактивных функций Вывести сообщение сгенерированное в отдельном потоке (thread) в окно инфо? |
|
![]() |
#11 |
Участник
|
|
|
![]() |
#12 |
Участник
|
Цитата:
Сообщение от S.Kuskov
![]() По-моему в тройке были какие-то проблемы с использованием infologa в потоке.
Threads Попробуйте без интерактивных функций Вывести сообщение сгенерированное в отдельном потоке (thread) в окно инфо? static client void run(Thread t) { int i = 1; ; i++; } Но самое интересное, что в run() ставлю точку останова, и туда вообще не попадаю. |
|
![]() |
#13 |
Участник
|
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']); } |
|
![]() |
#14 |
Участник
|
Цитата:
Сообщение от 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']); } |
|
![]() |
#15 |
Участник
|
выше я еже приводил ссылку Вывести сообщение сгенерированное в отдельном потоке (thread) в окно инфо?
|
|
![]() |
#16 |
Участник
|
vikuss2006 Странно. Должно работать. AX 2009 отрабатывает.
Про точку останова - глюк. Breakpoint в помощь... Только учтите, что основное приложение поток с таким кодом ждать не будет... Тут надо использовать waitUntilSignaled. |
|
![]() |
#17 |
Участник
|
X++: class FCH_ThreadDemo { } static client void main(Args args) { Thread thread; ; thread = new Thread(); //thread.setInputParm([...]); // Передать параметры в контейнере, если необходимо thread.removeOnComplete(true); // По завершении работы выгрузить поток thread.run(classnum(FCH_ThreadDemo), staticmethodstr(FCH_ThreadDemo, run)); // Выполнение thread.waitUntilSignaled(); // Ожидаем получение ответа из потока infolog.import(thread.getOutputParm()); // Выводит в инфолог полученный выходной параметр } static client void run(Thread _thread) { container packedArgs; ; //Получение параметров, переданных в потоке //packedArgs = _thread.getInputParm(); // Выполнение метода обычными командами Axapta info('Hello'); // Последней командой метода, скопировать infolog в выходной параметр потока _thread.setOutputParm(infolog.copy(1,infolog.num())); }
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
![]() |
#18 |
Участник
|
У меня Аксапта 2003 года, так что наверное, не будет работать
|
|
![]() |
#19 |
Участник
|
t.waitUntilSignaled() - Класс Thread не содержит эту функцию.
|
|
![]() |
#20 |
Участник
|
Тогда в родительском потоке в цикле опрашивать статус дочернего, пока не выполниться.
Метод thread.status есть? X++: thread = new Thread(); thread.run(classnum(FCH_ThreadDemo), staticmethodstr(FCH_ThreadDemo, run)); while (thread.status() != 2) { sleep(500); } [result] = thread.getOutputParm(); Последний раз редактировалось S.Kuskov; 25.03.2016 в 15:46. |
|
Теги |
com connector, com-объект, thread |
|
|