пятница, 26 сентября 2008 г.

Запуск внешнего приложения из Adobe Air и другое interconnectivity

ДА, я подозревал, что AIR-приложение не полноценно. Но я не знал, до какой степени! :). В нём нет ничего наподобии shellexec или exec и т.п. И это меня категорически огорчило. Потратив 3 часа на изучение вопроса в интернете узнал следующее:

  • Да всё действительно так плохо. И куча людей по всему миру ждёт решения этого вопроса.

  • Часть задач можно решить с помощью navigateURL
    Этим методом мы натравливаем браузер на локальный файл и (если браузер достаточно умный) он предложит открыть нам этот файл в дефолтном приложении(для данного типа файла) .
    Но тут все минусы на лицо: захотели Вы из AIR открыть doc-овский файл (или экселевский), а он запускает браузер. Браузер,в свою очередь, открывается, думает маленько и выкидывает окошко: Тут мне вот такое файло подсунули, чо с ним делать? Сохранять или открывать штоле?.
    Не очень умный вопрос, если человек только что в приложении нажимал кнопку "хочу ОТКРЫТЬ этот файл". Ну и вообще, я бы не взялся гарантировать работы всей этой схемы на разных компах. А что делать если вам надо запустить batch-скрипт? Браузер(firefox) даже вопросов не задаёт - просто открывает вкладку с текстом скрипта вместо того, чтобы попытатся его запустить. И я его (firefox) понимаю :)

  • В проджектированных(projector) swf-ках для этих целей (во всяком случае какое-то время назад) юзалась волшебная функция fscommand. В AIR она не работает, хотя и компилится. Проверял сам. Если я не прав и чего-то не доглядел, поправьте.

  • Для взаимодействия с конкретно Java сейчас пишется некое чудо по имени Merapi. Офсайт здесь. Эти ребята хотят забить на swing UI и использовать AIR в качестве фронтенда приложения, а начинку оставить Java'вскую. Мне это было интересно, потому что как раз с джавой и надо было скооперироватся. Но до конца я ещё не разобрался с этой темой. Разберусь - напишу.

    P.S. Как правильно заметил nuba Merapi это реинкарнация Artemis project

  • Есть ещё штука под названием Shu плеер.
    Она оборачивает AIR-приложение в собственый загрузчик, который интегрируется c AirRuntime, т.е. на выходе вы получаете просто экзешник, которому ничего не надо, и пользователь даже не будет знать что такое AIR и его Runtime. Кроме того, он добавляет как раз тот функционал который мне был нужен, а именно: запуск внешних приложений с коллбэком по результату их выполнения.
    Кроме того, есть возможность написать свою win32 dll, функции которой будут доступны в AIR приложении. А это, по сути, уже полная свобода действий внутри операционки(виндовой правда).
    Вот. Но! Cтоит это дело 500 баксов (или евро?). Это раз. И два. Я не смог всё это протестить (скачал бесплатную Try&Buy версию ). По каким-то там лицензионным заморочкам Shu не может включать в себя дистрибутив AirRuntime, поэтому, при завёртывании приложения оно как-то невнятно просит указать "путь к air runtime". Но какие бы я пути не указывал - ни один из них ему не нравился и процесс завершить не удавалось. Так я и не понял это баг или фича или лыжи не те или я...

  • Та-дам! И вот оно моё решение (почЁрпнутое из остальных прочитанных статей). Будем исопльзовать сервер приложения Т.е. пишем безоконный микросерверок слушающий какой-нить локальный порт и умеющий выполнять определенные команды. При установке приложения заменяем линк ярлыка, чтобы ярлык запускал не AIR-приложение, а наш микросерверок. Серверок запускается, проверяет всё ли в порядке, и сам уже запускает AIR-приложение. AIR-приложение, когда ему надо что-то сделать, чего оно само не может - засылает в сокет просьбу о помощи, микросерверок ловит и выполняет. Ну а дальше всё понятно. Так же можно вводить подтверждения, нотификации и т.д.
    На написание серверка в C# у меня ушло полчаса, as-класса для взаимодействия - 10 минут. Плюс отладка всего этого дела в связке. В итоге время было потрачено меньше, чем на чтение статей по вопросу :)) Что даёт такое решение? Да всё! :) Хочешь юзай .NET из Air, хочешь Java, коннекться к COM-порту, форматируй финчестер :))) и т.д.

    Если кому интересно могу все поделки повыкладывать .
    З.Ы.
    Выкладываю:
    1)С# сервер
    2) Пример посылки команды из AIR-приложения
    socket=new Socket();
    socket.connect("localhost",7777);
    socket.writeUTFBytes("$run myextapp.exe;");
    socket.flush();


  • 14 комментариев:

    Unknown комментирует...

    http://artemis.effectiveui.com/

    Я использовал вот это :)

    Гена "ScreameR" Шутко комментирует...

    А можно исходники всей этой прелести увидеть. Уж больно интересно, как это всё работает. Заранее спасибо)

    Анонимный комментирует...

    Порт это несколько плохо
    всякие фаерволы, может другой софт порты перекрывают... ругаццо будет
    localConnection помоему лучше

    гтето видел как челы c помощью джойстика для Nintendo Wii управляют флеш приложениями помоему юзают LC

    Buran комментирует...

    согласен socketы и фаерволы - могут быть проблемы. есть задумка сделать обмен данными через файл. По поводу localConnection - буду рыть, но при беглом осмотре мне показалось что эта технология не существует за пределами flash-плеера и соотвественно внешние приложения не могут получить к ней доступ.

    Анонимный комментирует...

    вот наглядный пример:
    http://www.darronschall.com/lc/lc.cfm
    работает )

    Buran комментирует...

    В рот мне ноги! Дэвид Блэйн! Как он это делает? :) Понял, будем копать :)

    Анонимный комментирует...

    >По поводу localConnection - буду рыть, но при беглом осмотре мне показалось что эта технология не существует за пределами flash-плеера и соотвественно внешние приложения не могут получить к ней доступ.


    http://osflash.org/localconnection

    Анонимный комментирует...

    вырабатывая это решение вы забыли про существование операционок кроме windows.

    Анонимный комментирует...

    ждем исходники :)

    Unknown комментирует...

    Buran, выложи, плз, сырцы - как раз что-то очень похожее надо сделать. Приятно будет не с нуля начать. ;)

    Buran комментирует...

    Сегодня вечером выложу! Просто я уже начал лабать тулзу для работы через localConnection но не успеваю. Вообще тема это зашибатая :) можно даже на sourceforge чонить открыть :)

    Buran комментирует...

    Выложил.

    OREL комментирует...

    прошло четыре года, а у меня появился вопрос именно по этому. Мне очень нужна возможность запуска внешних пиложений из AIR, а ваш сервер выдает ошибку - не найден указанный файл. Я в C# - ноль, подскажите что не так?

    Buran комментирует...

    Form1.cs, Line 209:

    private void startAir()
    {
    string wd=Application.StartupPath;// путь откуда запускаем
    string fn="MyAirApp.exe";// имя файла, что запускаем
    string args="";// аргументы с которыми запускаем
    ShellExec(wd,fn,args);// поехали
    }