Пользователь
0,0
рейтинг
15 февраля 2009 в 18:47

Разработка → Клиентские Windows приложения на JavaScript

Хочу рассказать про один интересный способ создания приложений на JavaScript с родным виндовым GUI.

Вообще, существует куча разных вариантов написания виндовых приложений на JavaScript:
  1. HTA и WSH — HTML Applications и Windows Script Host — это, вероятно, самые известные технологии. HTA фактически представляет собой HTML страницу с расширенными правами в системе — возможностью лазить в сеть, гадить в реестр, файловую систему и подключать к этим делам ActiveX. С использованием HTA сделаны многие компоненты самой Windows.
  2. .NET Framework — этому вообще по барабану, на чем вы пишете, лишь бы итогом был MSIL. Возможно, JScript.NET вместе с Windows.Forms могут вызвать у кого-то ощущение родного виндового интерфейса. Лично меня они совсем не радуют — ни визуально, ни скоростью.
  3. XULRunner — framework от Mozilla предлагает Gecko вместо IE, XpCOM вместо COM/ActiveX. Это всего за 20 мегабайт оверхеда.
  4. wxJavascript — известная кросс-платформенная библиотека wxWidgets теперь и для JavaScript. Все это благодаря JS-движку SpiderMonkey от Mozilla и стараниям одного бельгийца. Кстати, этот же уважаемый — автор mod_js для Apache.

Ввиду того, что все вышеописанное уныло, громоздко и требует изучения, предлагаю рассмотреть еще один вариант — WSO.

Цитируя автора:
WindowSystemObject (WSO) — это универсальный программный комплекс для обеспечения доступа к оконной подсистеме Windows на базе архитектуры COM, для создания оконных интерфейсов в программах, написанных на сценарных (скриптовых) языках, а также в программах, написанных на других языках и в других системах программирования. С помощью WSO можно легко создавать оконные интерфейсы на JScript, VBScript, Perl, Python.

После этих слов ничего, кроме огромного человеческого спасибо Александру Борисовичу Веретенникову, и не скажешь.

Опять цитата о возможностях WSO:
  • WSO обеспечивает полный доступ ко всем возможностям оконной системы, включая рисование в окнах и поддержку всех встроенных управляющих элементов Windows.
  • WSO поддерживает использование любых элементов ActiveX, таких как Internet Explorer или Windows Media Player.
  • WSO поддерживает работу со всеми популярными форматами графических файлов.
  • WSO доступен из любого языка программирования, поддерживающего COM-интерфейсы автоматизации.
  • Доступ к WSO осуществляется с помощью интуитивно понятной объектной модели, описанной в этом документе. Программисты, знакомые с оконным программированием для Windows, быстро обнаружат, что ничего нового им осваивать не нужно.
  • WSO обеспечивает полную поддержку обработки событий от оконных элементов.
  • WSO позволяет использовать символические имена констант, принятые в оконном программировании Windows, а не мучиться с их числовыми значениями.
  • WSO работает в любой современной версии Windows, а именно: 98SE, ME, NT 4, 2000, XP и 2003.


Все просто замечательно! Теперь единственное, что отделяет нас от родного GUI на JavaScript — это регистрация компонента WSO. Как известно, Windows требует регистрации в реестре COM/ActiveX компонентов перед их использованием. Это серьезное ограничение, так как нужны права администратора системы. Тем не менее, в Редмонде уже столкнулись с данной проблемой и, начиная с XP SP2, достаточно описать интерфейсы всех ActiveX в manifest приложения.
Итак, что нам нужно для сборки самостоятельной программы на JavaScript + WSO:
  1. Сам WSO.dll. Качаем и используем даже в коммерческих приложениях free of charge, но вознося хвалу Александру Борисовичу.
  2. Код программы на JavaScript. Примеры тут.
  3. Загрузчик app.exe, подключающий MS ScriptControl для интерпретации JS (фактически это аналог wscript.exe). Его нужно написать самостоятельно или взять готовый в конце статьи. В моем варианте это десять строк на Delphi — копипейст из статьи про ScriptControl.
  4. Манифест приложения app.exe.manifest — манифест, где нужно указать зависимость от компонента WSO, других ActiveX (если нужно) и заодно включить поддержку XP-шных тем оформления. Изготавливается вручную следующим образом:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity
      type="win32"
      name="client"
      version="1.0.0.0" />
      <dependency>
      <!-- подключаем WSO -->
              <dependentAssembly>
                  <assemblyIdentity
                      type="win32"
                      name="WSO.sxs"
                      version="1.0.0.0" />
              </dependentAssembly>
      </dependency>
      <dependency>
      <!-- поддержка тем оформления XP -->
    	<dependentAssembly>
    		<assemblyIdentity
    		  type="win32"
    		  name="Microsoft.Windows.Common-Controls"
    		  version="6.0.0.0"
    		  publicKeyToken="6595b64144ccf1df"
    		  language="*"
    		  processorArchitecture="x86"/>
    	  </dependentAssembly>
      </dependency>
    </assembly>
    

  5. Манифест для WSO — WSO.sxs.manifest, описывающий интерфейсы ActiveX компонента. Этот манифест генерируется замечательной программой regsvr42.exe. Она перехватывает все записи, которые делаются в реестр при регистрации компонента, и сохраняет их в виде manifest. Аналогичную операцию нужно проделать для всех внешних компонентов, которые вы хотите использовать.

Вот, что получилось у меня: WSO_demo.zip (573 Kb) slil.ru | onlinedisk.ru | rapidshare.de.
Загрузчик demo.exe создает глобальный объект WSO и запускает функцию main() из файла main.js.
Экзешник, естественно, можно переименовать (не забывая про его manifest) и вставить иконку любым менеджером ресурсов.
surething @surething
карма
17,2
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (39)

  • +7
    Хмм, а чем предлагаемая связка чужого ком+яваскрипт лучше например .NET, который есть уже почти на каждой машине с Windows? Чем оно лучше ХТА+ВСХ которые есть по умолчанию везде?
    И почему именно яваскрипт + GUI? Все-таки есть более удобные и приспособленные для создания GUI языки.

    Вообще тут наблюдается типичная проблема программизма — придумать себе нетрадиционную проблему (JS+GUI) и потом героически ее решать. Зачем программировать гуй на яваскрипте?
    • +2
      WSO лучше, чем HTA тем, что дает доступ к большинству фишек Windows GUI. Например, иконку в трей запихнуть.

      Мне нравятся скриптовые языки и не нравится .NET. Я могу делать простые приложения очень быстро, совершенно бесплатно и быть уверенным в том, что они заработают на любой XP SP2 и выше. Таким образом, все зависит от индивидуальных предпочтений и решаемых задач.
      • +9
        А вас не смущает то, что вы навязываете пользователю еще один, непонятно кем написанный и как поддерживаемый COM объект (ком само по себе то еще унылое ...), только для того чтобы вы были в чем то уверены?

        Что мешает вместо этого кома ставить wxABC (хотите скриптовых языков — питон вам в помощь), вы все равно что-то ставите дополнительное, так обоснуйте почему «левая» доп библиотека лучше поддерживаемого решения? Почему именно яваскрипт — отнюдь не самый производительный язык.

        А насчет вашей уверенности — а вы проверяли работоспособность такой связки при запрещенном в IE ActiveX (такое встречается сплошь и рядом, к тому же антивирусы часто орут на слишком любопытные активХ компоненты)? Вы уверены что данная связка не возьмет настройки ИЕ и будет всегда запускаться так как вы думаете, а не в режиме ограниченной функциональности (которую конечно же не учли при разработке, т.к. есть вера в то, что эта связка работает везде)?
        • +2
          Не, логика хотелки немного другая.
          Хочу писать нативные приложения на Javascript -> в HTA маловато возможностей -> .Net не нравится и лень читать MSDN -> у решений типа wxJavascript большой оверхед по размеру дистрибутива -> о, ух ты! есть левый COM в 1мб, который отвечает моим хотелкам. Кстати, WSO проверен — насекомых нет :)

          IE подключается в демке как пример. Его не обязательно использовать. К сожалению, HTA страдает от тех же проблем с безопастностью — и антивирусы орут, и настройки IE сильно влияют.
          • 0
            Имхо изначально странная хотелка.
            Особенно лень читать МСДН… Какого уровня вы хотите делать решения?
            • +1
              Я так и думал, что фраза «лень читать МСДН» вызовет негатив. Это забавно. А вдруг мне больше нравится ман по Cocoa? Холи вор? ;-)

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

              Я поделился решением, которое может помочь таким же, как я, любителям JS.
              • +1
                Ну зачем сразу холи вар =) просто для меня фраза «лень читать» что-либо — уже говорит об качестве подхода к проблемам = «лубочно-коленочный девеломент». Т.е. вы хотите программировать на языке, а не с использованием языка.

                Удачи вам и вашим пользователям с таким подходом.

                PS А насчет хлеба — мне не жалко, честно, тем более с таким отношением вы его много то отнять не сможете.
                Чем больше будет кодеров в этой профессии — тем выше будет оплачиваться моя работа :P
                • +3
                  Верно, я хочу программировать с использованием конкретного языка — JS. Он мне нравится.

                  Вы решили меня вразумить, что JS решает совсем другие задачи, что есть инструменты лучше и что никому неизвестный COM — это зло. Так и есть. Но так как в мои задачи не входит использование best practice технологий с отличной документацией, поддержкой и прочими возможностями, этот воспитательный момент просто не в кассу :(

                  Я не кодер, пользователи моих программ — друзья, и у нас все хорошо, спасибо ^_^
                  • +2
                    Ну что вы, вразумить… для себя и друзей пишите как вам нравится, хоть на асме

                    Просто вы еще и пропагандой такого подхода занимаетесь — если почитать статью выше — она полна выделенных «болдом» эпитетов — полный, любых, всеми, интуитивно понятный. А потом прийдут «неокрепшие умы», освоят это все дело и будут называться программистами. Печатное слово оно же силу имеет, до тех пор пока своим умом все шишки не набьют — многие верят безоговорочно — «раз вася сказал что оно лучше любых полное и интуитивно понятное» — знач так оно и есть.

                    Вы сделайте доброе дело — напишите область применения — только для себя и соседа и то, только для программ используемых не более 10 раз. Ну так, чтобы в следующий раз эта «технология», установленная в каком-либо ГлавПочтМедСпиртТресте не испортила бы кому-то час\день времени.
                  • –1
                    Поправочка — вы хотите программировать НА языке, т.е. опираясь только на его возможности и не желая программировать алгоритмы с использованием языка, т.е. когда первично решение, а под него выбирается удобный язык. Это нормально когда «для себя», но часто портит все когда так делают «надолго и всерьез». Вся языки разные — заточены под свои задачи.
          • +1
            я, например, для написания программ на WSO, буду читать документацию, равно как и мсдн, при всем при том что мсдн отлично скомплектован, имеет замечательное иде, которые можно обьеденить в одно… опять же (вроде после XP SP2).нет доступен на каждой машине (Vista и далее 100%)… опять же возможностей очень много, быстрота и скорость разработки тоже отнюдь не малы…
      • 0
        И не смущает то, что последнее обновление датировано 2006 годом? Т.е. предлагается к использованию заброшенная программа…
        • +1
          Последняя версия вышла 2008-06-23 :)
      • 0
        В принципе, мне тоже javascript нравится: и autorun на hta писал, и wsh активно использовал в работе админом. Но согласен с centur — всё хорошо в меру и к месту. Да и что-то новое всегда интересно изучать, уже глаз положил на Small Basic. А всякие информеры и виджеты можно писать под Windows Sidebar — связка того же javascript и html.
  • +4
    AIR + ExtJS не пробовали?
    • 0
      Да, спасибо за упоминание. Забыл в списке еще Boxely от AOL.
      Для моих задач AIR — достаточно тяжеловесное решение. К тому же требует инсталляции.
      • 0
        да уж… такой тяжеловесный и пять секунд инсталляции это так много.
        • 0
          да уж… очень конструктивный комент :)
          Windows версия AIR — чуть меньше 15 мегабайт. Для установки нужны права администратора.
          • +3
            — WSO делает один энтузиаст. AIR — корпорация Adobe.
            — число пользователей и разработчиков не равно. причём на порядки-порядки.
            — WSO под винду. AIR кросс-платформенное решение (винда, линукс, макОс).

            каждый сам выбирает, но лично для меня 15М и админские права (на собственном компе) это как бы пустое место.
            • –1
              Выше объяснил, почему мне не важны эти несомненные плюсы AIR.
              • +1
                прочитал.

                AIR _заточен_ под работу на JavaScript. Думаю вы это просто не знаете.

                И фактически номер Один в этом деле по массовости.

                Причем JS исполняется в Эйре в мозиловском движке.

                Поэтому недоумение то, что вы его обошли в своём «обзоре» появилось не только у меня.

                но… хозяин барин…
                • +3
                  Знаю. Я рассматривал все деривативы khtml, webkit и gecko.
                  Не претендуя на обзор всех технологий клиентского JS, я банально забыл про AIR… О, нет! Как я мог?! AIR — это же номер Один :D
          • 0
            Сами же говорите, что для себя и друзей. Поставить на паре компов программу не слишком сложно.
      • 0
        AIR — тяжеловесный??? (удивлен таким выводом)
        • +1
          Если само приложение весит 30кб, а для него надо скачать 15м рантайма.
  • +2
    О, спасибо. Не понимаю, как я его пропустил.

    Ещё есть dynwrapx — прямой доступ к winapi. Предлагаю упомянуть его посте.
    script-coding.info
    script-coding.info/dynwrapx.html
    • 0
      Ну… dynwrapx — это доступ к winapi. Из gui я не видел на нем ничего сложнее вызовов messagebox.
      • 0
        Ну… можно перебрасывать сообщения между процессами средствами winapi, например.
  • +1
    Для гнома нашел аналог Seed (http://live.gnome.org/Seed) забавная штучка
    там есть ссылка на пакеты к убунте
  • +1
    Некоторое время занимался разработкой HTA+JS приложения.
    Угораздило потом около года поработать с VS2008+ReSharper.

    Всему своя область применения, конечно, но я пришел к выводу что нужно переписать свое приложение на .NET, сохранив HTML интерфейс — слишком много приходится изобретать велосипедов и искать нестандарные решения для обычных задач. Выявление опечаток на этапе компиляции и автокомплит тоже весьма упрощают жизнь программисту :-)

    Думаю, что по мере Вашего роста как программиста и уровня проектов Вы к этому сами придете :-)
  • 0
    > JavaScript с родным виндовым GUI

    А нахера?? o_O
    • +1
      Да вообще зачем писать приложения, они же из интернета берутся… Кто-то пишет коммерческие приложения, кто-то для себя, если я знаю JavaScript и мне нужно маленькое приложение которого мне не хватает, я предпочел бы его написать на знакомом языке, может для виндов это и считается ненормальным на скриптовом языке писать гуевое приложение, но в *nix мире это вполне нормально и кроме троллей никто не жалуется.
  • 0
    Первый вопрос — нафига сдался «родной виндовый» интерфейс, если тенденция уже давно такова, что хочется приложений с собственными интерфейсами (отсюда и ноги RIA растут).

    Если уж хочется «родной виндовый клиент» с готовыми интерфейсами, контролами итд итп — используйте .NET Framework и WPF.

    И непонятно, почему именно JavaScript в таком контексте. Зачем? Понятно, удобен и прост, но тогда — AIR.
    • +1
      Если бы так думали все разработчики приложений мы бы видели очень пеструю картину на десктопе.
      Откуда это пошло? все просто до безобразия, виндовс каким мы его знаем с 1995 по 2007, целых 12 лет не давал пользователям поменять тему оформления, так что каждый разработчик пытался сделать красиво… на _его_ взгляд, AIR лишь продолжает эту традицию, ну и по тому как заточен под flex/flash. Почему так не любят офклиент icq кроме рекламы.
  • +1
    Для написания небольших утилит для собственных нужд размно обратить внимание на AutoIt — абсолютно бесплатное решение, позволяющее с легкостью создавать приложения с GUI.
    Насколько помню, на хабре уже было несколько публикаций на эту тему.
  • 0
    На Objective-J/Cappuccino тоже можно писать под WSH — таким образом перенося часть програмного стиля OSX на Win32.
  • НЛО прилетело и опубликовало эту надпись здесь
  • 0
    >WSO работает в любой современной версии Windows, а именно: 98SE, ME, NT 4, 2000, XP и 2003.

    Виста еще не современная )
  • 0
    Ещё есть Boxely от AOL.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.