Расширение проектора: Продолжение 8. Поддержка FP10.1
Плеер 10.1 напрочь отказался работать с оболочкой. Симптомы: любой метод возвращает undefined. После недолгих разбирательств
я установил, что прежде хорошо работавшие перехваты ReadFile() при обращении к шаредам, в 10.1 не катят. Что-то там сильно поломали и
перехват перестал работать. Возможно, функция ReadFile() стала импортироваться в коде динамически, на что есть и косвенные подтверждения.
Покрутившись и так, и сяк, перепробовав десяток других вариантов перехвата, я расстроился, у меня ничего не вышло, и я решил окончательно отказаться от этого двига. Действительно, в следующих версиях плеера врядли что-то восстановят как было, скорее уж еще что-нибудь поломают.
Впрочем, что касается AS2-проектов, они по-прежнему успешно работают на этом движке с шаредами, но только в плеерах не старше 10.0.
Пару недель я пребывал в унынии. Растроишься тут!(: Попутно я начал искать основу для нового движка. Побочным продуктом этих поисков, например, появилась статья про asm-вставки. Но вот, наткнулся в "Хакере" на небольшую статейку про eggshunting. Это такой способ внедрения шелл-кода в адресное пространство чужого процесса. Суть не в этом. А в том, что эта статья натолкнула меня на очень простую идею (как я раньше не додумался, не представляю!).
Идея по-истине незамысловата: использовать для обмена данными между проектором и оболочкой класс ByteArray.
Итак, при старте проектор инициализирует экземпляр byte array. Дальше, в оболочке надо найти этот массив, получить указатель на область памяти, где он был размещен. Как?! Перехват VirtualAlloc() тут мучить не айс, ибо вызывается она тут и там, и отсеять мух от котлет было бы затруднительно.
Вот тут нам и помогут "яйца"! В этом контексте яйца - это заведомо уникальный в памяти процесса последовательный (или нет) набор байтов (чисел). Для того, чтобы исключить остатки случайности, берут два таких набора и размещают их друг за другом, от того и яйца
![Smile](images/smilies/smile.gif)
Значит, при инициализации массива, делаем закладочку:
Код:
private static function eggs(arr:ByteArray):void { for (var i:uint = 0; i < 8; i++) { arr[i] = arr[i+8] = 0x61 + i + i; } }
Ну, и пинаем оболочку по LC-каналу - "давай! бери меня за яйца!". В оболочке мы быстренько шерстим память байт за байтом, и.. о! да! вот они! И элементарно запоминаем указатель на начало области размещения закладки. Отлично!
Дальше - дело техники. Вызов метода оболочки теперь выглядит так:
- формируем в проекторе объект с данными запроса (имя метода, аргументы);
- записываем объект в массив (writeObject());
- даем знать оболочке - "забирай и работай"... оппа! а как?
(ну, тут я заюзал System.setClipboard() c фейковым параметром-строкой, и поставил перехват на OpenClipboard())
- после отработки, оболочка записывает ответ-данные в тот же массив, сериализуя в AMF3, и отпускает вызов System.setClipboard();
- ну, вот, теперь делаем в проекторе readObject() и радуемся жизни!
По-дефолту, массиву задается размер 1 Мб. Оболочка следит, чтобы ответ убрался в этот размер, иначе выдается объект, в поле котрого len записан требуемый размер. Тут есть два варианта дальнеших действий: либо попытаться загрести данные по частям (например данные из файла), либо ... сделать реаллок памяти массива и загести все разом. Да! Такое тоже возможно, на что я сделал специальный метод FlrunEx.reallocMem(newSize:uint). Вобщем-то, все изменения коснулись только класса FlrunEx, весь остальной АПИ остался прежним.
Посмотрев на результаты, я остался доволен. Еще бы, скорость обмена данными увеличилась в разы. Да, и есть неплохие шансы, что
в будщих версия плеера новый движок будет работать на ура.
Обновленные сорсы, доки и длл выложил в гугл. Подчеркну, что с новой lcevt.dll (v2.0.0.5) сорсы AS2 работают так же как и раньше, но только до версии плеера 10.0, сорсы AS3 нужно обязательно обновить до текущей версии и работают они с плеерами 9.0, 10.0, 10.1.
Да пребудет с нами сила!
Всего комментариев 25
Комментарии
![]() ![]() |
|
Новости не без изюминки. )
|
![]() ![]() |
|
не знаю-не знаю.. информация о пригодности к удалению, должно быть, не хранится в объекте, где-то повыше, наверно..
|
![]() ![]() |
|
2 alexcon - где вы такой бубен взяли? хочу!
|
![]() ![]() |
|
Бубен, благодаря которому, находите такие нетривиальные решения.
![]() Очень нужен! |
![]() ![]() |
|
И под какой операционкой это может работать?
Все очень запутанно и не понятно!!! и поставил перехват на OpenClipboard() - это когда изучал поставил или как? сделал специальный метод FlrunEx.reallocMem(newSize:uint) - extprojector кажется работает через ActiveX? Перехват VirtualAlloc() тут мучить не айс, ибо вызывается она тут и там, и отсеять мух от котлет было бы затруднительно. - что это значит я не врубился вообще? И что такое проекторо и оболочка? |
|
Обновил(-а) NumpuT 26.11.2010 в 00:05
|
![]() ![]() |
|
Цитата:
И под какой операционкой это может работать?
Цитата:
extprojector кажется работает через ActiveX?
Цитата:
...- это когда изучал поставил или как?...что это значит я не врубился вообще?
![]() Цитата:
...Все очень запутанно и не понятно!!!...И что такое проекторо и оболочка?
![]() |
|
Обновил(-а) alexcon314 26.11.2010 в 18:07
|
![]() ![]() |
|
2alexcon. А есть браузер в либе? Можно ли как нибудь webkit/chromium прикрутить, чтоб отображался во флэше.
что-то вроде air.HTMLLoader или mdm.Browser |
![]() ![]() |
|
Цитата:
А есть браузер в либе?
Есть основа, написанная с использованием стандартного ИЕ-двига, стандартного, в смысле системного контрола. Что было сделано - создается/прячется/позиционируется окно в проекторе как дочернее (ну без рамки, конечно), ловятся ивенты: посыл/прием/ошибки/прогресс, отправляются запросы, организован доступ к дом, можно налету генерить прям в ас странички ... что-то еще было вроде... а, да, была задумка что-то типа "искусственного" ExternalInterface прикрутить, не по форме, а так, по смыслу. Дописать никак руки не доходят. В контроле этом клятом дофига всякой всячины напихано). Вебкитовский двиг пока вообще не копал, да и копать-то смысл? Таскать его потом с собой? ЗЫ Когда будет, не знаю, но будет. Хотелось бы сделать и руки чешу, но... полоса чет затянулась. |
|
Обновил(-а) alexcon314 06.12.2010 в 08:58
|
![]() ![]() |
|
А можно ли как нибудь глянуть на "основу"?
Очень надо. Я тут описывал проблему с плагином WMP и эйровcким вэбкитом - решение нужно позарез. Пробовал цинк, что-то браузер у меня вообще в нём не работает, может из-за системы (win 7 64) |
![]() ![]() |
|
В рабочем порядке выложил то, что удалось за день прикрутить из заготовок здесь. В архиве тестовый FD-проект со всеми либами и сорсами. Положи в папку output автономный плеер с названием FlashPlayer_10.exe и жми build. По исходнику сориентируешься, как там и что, надеюсь), там десяток строчек. Ну, или пиши в личку. В принципе, если тебе надо немного фич, может и недолго все будет
![]() ЗЫ. Извини за плохо оформленный пример. Просил срочно, делал "между делом". |
|
Обновил(-а) alexcon314 07.12.2010 в 16:58
|
![]() ![]() |
|
alexcon314
Хочу написать про лаги 11.3 flash player: 1) PWeb - Твой пример (бла-бла) на секунду запускается и потом сразу вылетает. 2) PMenu - Если поставить VIEW_NOALL, то вылетает ошибка. 3) PWindow - Не меняется иконка. Все, что я проверял. Нету времени проверять другое, очень занят одним проектом. Пожалуйста, проверь, исправь, обнови и добавь новых функций: 1) Прозрачное окно. 2) Аснихронное управление файлами. 3) По своему усмотрению Исправь ошибки в названиях функций, в доках, например,функция: setIconFomFile Ты имел ввиду setIconFromFile? И т.д. Вот: Скачать FlashPlayer 11.3 |
|
Обновил(-а) MikroAcse 31.07.2012 в 23:36
|
![]() ![]() |
|
Может на даты поста посмотрите?
|
![]() ![]() |
|
Цитата:
Может на даты поста посмотрите?
Что, у постов есть срок годности? Ведь полезный движок, а? |
![]() ![]() |
|
MikroAcse, спасибо за замечания. Постараюсь посмотреть, что можно сделать).
Беглый осмотр на подопытном 11.4 beta показал, таки да, меню контекстное не убирается. С остальными пунктами проблем не заметил. setIconFromFile(file:String) - буквально "установить иконку из файла", т.е. иконка берется из файла, как-то вроде оно по делу,не? Изначально в этот проект, если так можно выразиться, увы, была заложена мина замедленного действия. С выходом новых версий плеера что-то, порой, значительно меняется в его недрах. А движок сильно зависим от внутренностей плеера. Я несколько раз правил двиг, обновлял, но сейчас не слежу, просто некогда. Ах,да. новые фичи... Вряд ли что-то буду вносить своего... Из твоих пунктов: 1) Прозрачное окно - отпадает, ибо неимоверно трудно, а смысла особого нет. 2) Аснихронное управление файлами - асинхронные IO-операции? ну, да.. с этим можно было бы поработать, но опять же не выжу смысла. В плеере операции с файлами, те, что есть в API, и так асинхронные. Ну, а на даты постов смотреть полезно)). Все это затевалось во времена, когда в ходу еще был 8-ой (!) плеер, но уже появился 9. Тогда эта тема была благодатной. Чутка позже вышел AIR. С выходом новых верисий AIR актуальность расширения проектора вообще стремится к нулю, разве что в каких-то уж совсем немыслимых ситуациях оно может пригодиться, или разработчика айр пугает. |
|
Обновил(-а) alexcon314 01.08.2012 в 09:14
|
![]() ![]() |
|
Печаль.
Я думал Вы продолжаете заниматься этим проектом. Air мне никогда не нравился. Ну ладно, спасибо за ответ. |
![]() ![]() |
|
Я как бы не забросил совсем уж.. Нехватка времени, снижение интереса к теме вцелом, так скажем.
|
![]() ![]() |
|
Да мне не надо создавать на мобилы приложения.
А есть варианты: бесплатный, обновляемый, простой, небольшой, не виснущий движок? (что-то я перегнул ![]() |
![]() ![]() |
|
бесплатный, обновляемый, простой, небольшой, не виснущий движок?
сам напиши ![]() |
Последние записи от alexcon314
- Пишем свою оболочку для FP под Windows. Шаг 6. (19.05.2011)
- Пишем свою оболочку для FP под Windows. Шаг 5. (18.05.2011)
- Пишем свою оболочку для FP под Windows. Шаг 4. (18.05.2011)
- Пишем свою оболочку для FP под Windows. Шаг 3. (18.05.2011)
- Пишем свою оболочку для FP под Windows. Шаг 2. (17.05.2011)