пятница, 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();


  •