1

Тема: JScript: Работа с WinAPI без регистрации в реестре

Я думаю многие на форуме привыкли работать с DynamicWrapperX, написанного коллегой YMP. Но иногда крайне не хочется оставлять следы в реестре. Проблема решается использованием технологии манифестов.

Код, который вложен в пост, перечислит открытые окна с использованием WinAPI.

Вкратце по алгоритму. Файл js хранит в себе ресурсы (2 манифеста, ActiveX-библиотеку и wscript.exe). При первом запуске осуществляется их проверка наличия возле файла скрипта. Далее, ресурсы распаковываются, после чего заново осуществляется запуск нашего js, но с помощью распакованного хоста wscript.exe.

Если есть у кого-то мысли по оптимизации, я буду рад слышать. Представляется, что одним из направлений оптимизации является сжатие кода путем вложения cab-архива, в котором находятся все 4 ресурса.

Post's attachments

jscript.api.test.js.txt 214.98 kb, 30 downloads since 2014-10-12 

You don't have the permssions to download the attachments of this post.

2

Re: JScript: Работа с WinAPI без регистрации в реестре

JSman
Вы бы прямо тут манифест для x64 выложили, чтобы не перепрыгивать с x32 для запуска.

3

Re: JScript: Работа с WinAPI без регистрации в реестре

Flasher, я опубликовал универсальное решение. Оно запускается на 32-битных и 64-битных системах. Если нет, поправьте.

4

Re: JScript: Работа с WinAPI без регистрации в реестре

JSman, я же не могу сходу Resources распарсить. Вам сподручнее. )
Мне нужно сразу иметь оба варианта на потенциальный запуск (внутренняя переменная среды даст имя папки x32/x64).
P.S. Хотя полагаю там всего пару строк надо поправить в манифестах. Компонент и интерпретатор и так при мне.

5

Re: JScript: Работа с WinAPI без регистрации в реестре

В коде используется только 32-битная версия. Вот манифесты.

wscript.exe.manifest

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">

<assemblyIdentity
  type="win32"
  name="wscript.exe"
  version="1.0.0.0" /> 

  <dependency>
          <dependentAssembly>
              <assemblyIdentity
                  type="win32"
                  name="dynwrapx.sxs"
                  version="2.1.0.0" />
          </dependentAssembly>
  </dependency>

</assembly>

dynwrapx.sxs.manifest

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">

<assemblyIdentity
    type="win32"
    name="dynwrapx.sxs"
    version="2.1.0.0" />

<file name="dynwrapx.dll">
     <comClass
        clsid="{89565276-A714-4a43-912E-978B935EDCCC}"
        threadingModel="Both"
        progid="DynamicWrapperX" />
</file>

</assembly>

6 (изменено: Flasher, 2014-10-12 20:06:59)

Re: JScript: Работа с WinAPI без регистрации в реестре

Т.е. отсюда (только с обновлёнными данными для версии 2.1). А, Вы только интерпретатор вытаскиваете, ясно.

7

Re: JScript: Работа с WinAPI без регистрации в реестре

Если есть у кого-то мысли по оптимизации

Несколько вариантов. Можно использовать вместе или по отдельности.

1. весь код внести в одну безымянную функцию, вызываемую in-place


(function()
{
})();

2. отказаться от метода Function.prototype.GetResource и полностью перенести функционал в функцию GetResource, чтобы "не засорять" прототип Function. Ведь Function.prototype.GetResource используется единожды - для распаковки ресурсов.
3. Сами ресурсы прятать в комментарии вида /*![[ ]]*/. Такие комментарии (с дополнительным восклицательным знаком) называются "важными" и умными сжимателями кода не удаляются.
4. Рекомендовать два способа использования

Способ А
Вставить предложенный код в начале своего проекта

Способ Б
Положить файл рядом со файлом своего проекта и в его начале выплнить код:


eval(function()
{
// открыть файл
// прочитать содержимое в переменную
// вернуть результат
}());

Как модификация всего. Весь код оформить в виде именованной функции (имя придумайте сами) и использовать почти аналогично сказанному выше

Способ В: используется особенность javascript - неявное "всплывание" объявлений функций


имя_функции();
// начинайте писать код с этого места :)
// вставить код в конце своего проекта

И вопрос новичка. Создание новой копии wscript.exe обязательно? Читал, но ни разу не пользовался таким свойством.

( 2 * b ) || ! ( 2 * b )

8

Re: JScript: Работа с WinAPI без регистрации в реестре

Rumata, да,  обязательно. Казалось бы можно было скопировать его из системной директории, но не всегда это получается при ограниченных правах.  Может быть через cmd стоит попробовать.

9

Re: JScript: Работа с WinAPI без регистрации в реестре

Rumata пишет:

И вопрос новичка. Создание новой копии wscript.exe обязательно? Читал, но ни разу не пользовался таким свойством.

Естественно, при запуске WScript.exe в порядке приоритета сперва рассматриваются манифесты внутри каталога, где он лежит, а потом уже WinSxS. В этом суть переносного подхода.

10

Re: JScript: Работа с WinAPI без регистрации в реестре

Rumata пишет:

1. весь код внести в одну безымянную функцию, вызываемую in-place


(function()
{
})();

Окей.

Rumata пишет:

2. отказаться от метода Function.prototype.GetResource и полностью перенести функционал в функцию GetResource, чтобы "не засорять" прототип Function. Ведь Function.prototype.GetResource используется единожды - для распаковки ресурсов.
3. Сами ресурсы прятать в комментарии вида /*![[ ]]*/. Такие комментарии (с дополнительным восклицательным знаком) называются "важными" и умными сжимателями кода не удаляются.

Да проще отказаться от ресурсов и конвертировать данные в строковые литералы. Согласен, что нужно избегать расширения прототипов тогда, когда это не критично.

Rumata пишет:

4. Рекомендовать два способа использования
Способ А
Вставить предложенный код в начале своего проекта

Способ Б
Положить файл рядом со файлом своего проекта и в его начале выполнить код:


eval(function()
{
// открыть файл
// прочитать содержимое в переменную
// вернуть результат
}());

Как модификация всего. Весь код оформить в виде именованной функции (имя придумайте сами) и использовать почти аналогично сказанному выше

Способ В: используется особенность javascript - неявное "всплывание" объявлений функций


имя_функции();
// начинайте писать код с этого места :)
// вставить код в конце своего проекта

Оба способа приемлимы.

Давайте еще подумаем как уменьшить скрипт. Может быть можно справиться с копированием wscript.exe? Если получится, то код существенно сократится. Плюс я говорил об использовании cab.