Снегопат https://snegopat.ru/forum/ |
|
Reborn и OneScript https://snegopat.ru/forum/viewtopic.php?f=3&t=719 |
Страница 1 из 4 |
Автор: | syuzyov [ 20 июн 2016, 10:04 ] | ||
Заголовок сообщения: | Reborn и OneScript | ||
Уважаемые коллеги, нужна помощь коллективного разума. Пытаюсь подружить reborn и snegopat, так как это вещи, которые должны дружить, без вариантов . Это продолжение тем viewtopic.php?f=1&t=618&p=8271&hilit=onescript#p8271 и viewtopic.php?f=3&t=638&p=9232&hilit=onescript#p9232 disclaimer: сишник из меня как из никакой, практический опыт разработки ПО вне 1С близок к нулю, по com прочитал по диагонали полторы книжки. Поэтому прошу понять и пояснить, если где-то по ходу текста пернул в лужу:). Камрад EvilBeaver (На всякий случай: автор односкрипта. Андрей, спасибо за советы и моральную поддержку) с первым снегопатом односкрипт интегрировал так: 1. В снегопат подгружалась dll snegopat.engine.dll 2. Далее все манипуляции со односкриптами выполняла эта dll, дергая по необходимости snegapi (немного не так, но для упрощения опустил) Что сделано для адаптации под реборн: 1. dll успешно подгружается в реборн. Загрузка и так осуществляется через invoke, поэтому все правки ограничились редактированием получаемых из реборна свойств (vttable идут уже при вызове исполнения): Код: InsertProperty("addins"); InsertProperty("develop"); //добавлен //InsertProperty("cmdTrace"); - переехал в develop InsertProperty("events"); InsertProperty("profileRoot"); InsertProperty("snegopat"); InsertProperty("hotkeys"); InsertProperty("windows"); InsertProperty("metadata"); InsertProperty("v8files"); InsertProperty("env"); //добавлен //InsertProperty("ownerName"); - переехал в env //InsertProperty("v8debug"); - не реализован //InsertProperty("sVersion"); - переехал в env //InsertProperty("v8Version"); - переехал в env Все, дальше пока делать не стал. Почему? Потому что текущий вариант взаимодействия мне решительно не нравится: 1. Для загрузки односкриптов нужно сначала обязательно загрузить snegopat.engine, при этом решительно непонятно нахрена - чем OneScript хуже, чем JavaScript и VBScript, для работы с которыми, с т.з. конечного пользователя ничего не требуется? 2. В продолжение п. 1 кажется правильным знать снегопату об односкрипте как среде исполнения, но никак не наоборот. 3. В реборне из коробки нет возможности через стандартный интерфейс увидеть в репо скрипты с расширением, отличным от js (то есть даже vbs обделен). Лепить свой интерфейс для подключения аддинов кажется неправильным 4. Даже в старом снегопате не смог подцепить односкрипт на хоткей через интерфейс снегопата (может, конечно, я дурак, и очевидных вещей не знаю). Фактически односкрипт живет своей жизнью рядом со снегопатом, самостоятельно реализует загрузку своих аддинов, самостоятельно их вызывает, дергает snegapi, и все это на уровне обертки для среды исполнения. Жуть имхо в общем, а EvilBeaver заслуживает прижизненного памятника на красной площади за проявленный героизм и находчивость Предпринята попытка попробовать заставить реборн заглотить односкрипт "естественным" путем: 1. Поправлены скрипты реборна (repo.ts, scriptLoader.as), чтобы иметь возможность видеть в репо односкрипты, см. (1).Кстати, текущая реализация отображения в репо скриптов позволяет в одной папке показывать скрипты только с одним расширением, поэтому пока убран фильтр по расширению в классе репозитария (см. class RepoSystem в repo.ts) 2. Исследован код реборна до момента собственно выполнения скрипта:addins.as: Код: // Теперь пробуем запустить его if (!fndLdr.value.run(addin)) { Дальше затык (точнее отведенное на вчера время закончилось с большим оверхэдом): 1. Не умею отлаживать AngelScript, а на чистом понимании кода уж больно тяжко - слишком мало опыта 2. Здесь исполнение уходит в snegopat.dll, то есть для меня это черный ящик Теперь вопросы: To orefkov: 1. Саша, прокомментируй пожалуйста, есть ли какие-то помехи для такой реализации? 2. Если помех нет, то много ли потребуется менять в snegopat.dll? Если помехи есть, то хотелось бы понять, какие (пока не понимаю, чем в этом плане oscript хуже jscript). 3. Можно вкратце рассказать, что происходит дальше при вызове fndLdr.value.run(addin)? 4. Как отлаживать ангелскрипты? С чего начать? Куда копать? AngelscriptIDE? ASIDE? ...? 5. Если найдутся желающие помочь, может быть можно разместить официальный репо на github (без dll, естественно)? Или придется привыкать к fossil? To all: 1. Какой вариант интеграции кажется более правильным? Первый вариант не требует Сашиного участия; второй более красивый, но не уверен, что можно обойтись без правки snegopat.dll малой кровью. 2. Есть ли желающие совместно поковыряться? Если что, готов поделиться опытом, как по-быстрому (за 20 часов) въехать в c++, com (точнее dispinterface), и подготовить среду разработки. Почувствуй себя кулхацкером! Сейчас ухожу в отпуск, то есть в ближайшие дни буду больше читатель, чем писатель. В начале июля попробую продолжить, но видимо не суперинтенсивно - отчетность…
|
Автор: | orefkov [ 20 июн 2016, 11:00 ] |
Заголовок сообщения: | Re: Reborn и OneScript |
То, что для работы со скриптами OneScript необходимо подгружать отдельную длл, а для работы js-скриптов не надо - это не так. Там точно также загружается jscript.dll, которая выполняет код на Javascript, периодически дёргая методы из snegapi, просто эта загрузка происходит неявно для пользователя. Вобщем-то, реализация работы с любыми видами аддинов в этом и заключается - реализовать свой загрузчик аддинов, который "самостоятельно реализует загрузку своих аддинов, самостоятельно их вызывает, дергает snegapi, и все это на уровне обертки для среды исполнения". Пример такого загрузчика есть в "core\engine\scriptLoader.as" (загрузчик аддинов на ActiveScript-движках) и "core\engine\dllloader.as" (загрузчик аддинов-длл), их код и надо изучать. То, что просмотрщик репозитария (repo.js) не видит скриптов на OneScript - естественно, так как механизм работы с аддинами предусматривался универсальным, и сами аддины становятся известными репозитарию через файлы *.info в каталоге list (парочка там лежит для примера). Подробнее написано в справке к встроенному аддину repo.js. То, что файлы js из корня репозитария видны сразу без использования info-файлов - небольшая уступка для личного удобства Поэтому для реализации загрузки аддинов на OneScript - надо на AngelScript сделать свою реализацию интерфейсов AddinLoader, которая загружает и запускает скрипты на OneScript, и свою реализацию интерфейса Addin, которая будет служить для взаимодействия снегопата с загруженным аддином на OneScript - будет выдавать список макросов в аддине и вызывать их на выполнение. Я попробую сделать это на этой неделе. |
Автор: | syuzyov [ 20 июн 2016, 11:56 ] |
Заголовок сообщения: | Re: Reborn и OneScript |
Ооо, я знал, знал, что счастье возможно! Спасибо! Если со временем туго, то я готов продолжить. По repo.ts и .info как-то проморгал, спасибо. А по отладке as можешь что-нибудь посоветовать (если, конечно, не сильно затруднит)? Даже не столько отладка интересует, сколько упрощение анализа кода - логирование там, вывод в консоль значений, может еще какие есть доступные способы. Просто боюсь у меня и неделей на адаптацию без начального пинка дело не обойдется. |
Автор: | syuzyov [ 20 июн 2016, 12:14 ] |
Заголовок сообщения: | Re: Reborn и OneScript |
Цитата: Пример такого загрузчика есть в "core\engine\scriptLoader.as" (загрузчик аддинов на ActiveScript-движках) и "core\engine\dllloader.as" (загрузчик аддинов-длл), их код и надо изучать. О, вроде становится понятней, спасибо. |
Автор: | orefkov [ 21 июн 2016, 09:55 ] |
Заголовок сообщения: | Re: Reborn и OneScript |
syuzyov писал(а): Ооо, я знал, знал, что счастье возможно! Спасибо! Если со временем туго, то я готов продолжить. По repo.ts и .info как-то проморгал, спасибо. А по отладке as можешь что-нибудь посоветовать (если, конечно, не сильно затруднит)? Даже не столько отладка интересует, сколько упрощение анализа кода - логирование там, вывод в консоль значений, может еще какие есть доступные способы. Просто боюсь у меня и неделей на адаптацию без начального пинка дело не обойдется. С отладкой в AS туговато. Есть начатки стороннего отладчика, и в первые snegopat.dll я его включал, но он что-то подглючивает, и я его пока отключил. Пока в основном использую "Message(text)" и "Print(text)". Еще есть "doLog(text)". |
Автор: | syuzyov [ 21 июн 2016, 11:04 ] |
Заголовок сообщения: | Re: Reborn и OneScript |
Спасибо. Поскольку для неофитов вроде меня AngelScript - один из существенных камней преткновения в изучении реборна, постараюсь систематизировать свой опыт, собрать все вопросы и ответы, и опубликовать в отдельной ветке - думаю многим это облегчит вход. |
Автор: | syuzyov [ 21 июн 2016, 11:17 ] |
Заголовок сообщения: | Re: Reborn и OneScript |
По ActiveScript: ознакомился с технологией, понял свои ошибки в рассуждениях. Для работы с OneScript по аналогии с Javascript необходима реализация Active Script Engine, тогда достаточно будет немного доработать scriptLoader.as, и загрузка односкриптов будет работать через команду "Загрузить скрипт", верно? Другой вариант: делать свой лоадер по аналогии с core\engine\dllloader.as, делать отдельную команду "Загрузить oscript", которая будет видна отдельным пунктом меню, верно? |
Автор: | syuzyov [ 21 июн 2016, 11:29 ] |
Заголовок сообщения: | Re: Reborn и OneScript |
По репо: понял, что не нравится в плане user xp - интуитивно совсем другое ожидал, но это наверное тоже в отдельной теме лучше напишу чуть позже. |
Автор: | orefkov [ 21 июн 2016, 11:53 ] |
Заголовок сообщения: | Re: Reborn и OneScript |
syuzyov писал(а): По ActiveScript: ознакомился с технологией, понял свои ошибки в рассуждениях. Для работы с OneScript по аналогии с Javascript необходима реализация Active Script Engine, тогда достаточно будет немного доработать scriptLoader.as, и загрузка односкриптов будет работать через команду "Загрузить скрипт", верно? Другой вариант: делать свой лоадер по аналогии с core\engine\dllloader.as, делать отдельную команду "Загрузить oscript", которая будет видна отдельным пунктом меню, верно? Всё правильно. Единственное, при подключении из репозитария для пользователя видимой разницы между скриптами и os-скриптами не будет. |
Автор: | syuzyov [ 21 июн 2016, 22:30 ] | ||
Заголовок сообщения: | Re: Reborn и OneScript | ||
Очень хелп нидед. Прошу прощения за нытье, но честное слово, начинаю впадать в уныние… Потратил сегодняшний день на изучение снегопата (объектная модель, реализации членов классов, …) и angel script (сборка прототипа, прикрутка asPEEK в качестве отладчика, …) появилось куча вопросов (но это в отдельные темы лучше - очень много и очень разное). В конечном принял решение сейчас все-таки запуститься хоть как-нибудь с тем, что есть. Сразу возникла проблема: Нужно зарегистрировать лоадер при загрузке dll. Для старого снегопата имеем: Код: hr = invoke(addinsObj, DISPATCH_METHOD, NULL, NULL, NULL, L"registerLoader", L"U", loader); На реборне получаю hr: 0x80020003 Член группы не найден, что в общем легко объясняется: если раньше у Designer.addins такой метод был, то теперь смотрим дамп snegopat.d.ts (кстати все-таки очень огорчает, что GetDocumentation в snepgopat не реализован, и отражение этого факта в документации ситуацию никак не улучшает): Есть Код: declare var Designer: _IfaceDesigner; ок, есть Код: interface _IfaceDesigner { addins: AddinMgr; ок, есть Код: interface AddinMgr { root: AddinGroup; libs: AddinGroup; users: AddinGroup; sys: AddinGroup; lastAddinError: string; count: number; byUniqueName(name: string): Addin; byFullPath(fullPath: string): Addin; byIdx(idx: number): Addin; loadAddin(uri: string, group: AddinGroup): Addin; unloadAddin(addin: Addin): boolean; getLoaderCommands(): string[]; selectAndLoad(loaderCommand: string, group: AddinGroup): Addin; isAddinUnloadable(addin: Addin): boolean; Опаньки, куда делся registerLoader? Начинаю искать, и нахожу описание его в 99 snegapi.md: Код: <a name="IAddinMgr"></a> ## Объект IAddinMgr > портирован полностью ... ### Метод registerLoader Регистрирует дополнительный загрузчик аддинов. Синтаксис: addins.registerLoader(Загрузчик) Параметры: - Загрузчик. Объект [IAddinLoader](#IAddinLoader), реализующий дополнительный загрузчик аддинов. Попробовал в отладчике js посмотреть Designer (ну мало ли), результат в (1) - метода нет. В коде js или as registerLoader нигде не втречается. Встает законный вопрос - а как же scriploader и dllloader себя регистрируют, или кто их регистрирует? Без отладчика я не смог найти ответ за разумное время. Может это лоадеры-депутаты с двойными стандартами, которым можно то, что нельзя простым смертным лоадерам? Типа как js-скрипты, которые вне очереди и без пропусков отображаются в репо, пока vbs бумажки (.info) оформляют? Понимаю, что меня уже несет, возможно мое незнание меня опять подводит, прошу понять и простить Ну и собственно вопрос: как все-таки зарегистрировать свой лоадер?
|
Страница 1 из 4 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |