Встраивание Windows Scripting в свои приложения
От: Аноним "Клиент-Сервер"  
Дата: 25.03.02 03:09
Оценка: 161 (5)
Статья:
Встраивание Windows Scripting в свои приложения
Автор(ы):
Дата: 25.04.2001


Авторы:
"Клиент-Сервер"

Аннотация:
ATL постепенно становится все более популярным в среде программистов, и пример встраивания поддержки скриптов в приложения мы приведем на этой основе. ATL — одна из самых низкоуровневых библиотек С++, и на ее примере хорошо видны подробности процесса. С помощью Microsoft ActiveX Scripting вы можете относительно просто использовать скрипты в ATL-приложениях. В этой статье показано, как создать новое или модифицировать уже имеющееся ATL-приложение для поддержки VBScript.
!!! Отличная статья.
От: Gambler  
Дата: 26.03.02 03:09
Оценка:
!
-------------------------------------------------------------------

Вызывает презедент к себе коров и говорит:
— Ну, что будем сдавать, молоко или мясо?
(с) Г. Явлинский TV6 — Герой дня (18.04.2002)
Re: !!! Отличная статья.
От: Roger  
Дата: 08.08.02 09:26
Оценка:
Причем видел ее в MSDN ))
Re: Встраивание Windows Scripting в свои приложения
От: SVV Беларусь  
Дата: 19.07.05 14:20
Оценка:
Здравствуйте,

а можно ли добавить не конкретный объект:
RET_FAIL(spAS->AddNamedItem(OLESTR("MyObject"), SCRIPTITEM_ISVISIBLE |
SCRIPTITEM_ISSOURCE), "IActiveScript::AddNamedItem()");

а возможность создавать стандартные ActiveXObject: FileSystemObject, Shell, примерно таким способом:
var    fso, Sh;
fso = new ActiveXObject("Scripting.FileSystemObject");
Sh = new ActiveXObject("WScript.Shell");

???
Re: Дополнение про JScript
От: SVV Беларусь  
Дата: 14.09.05 13:26
Оценка:
...
Примеры в статье даны для VBScript, у него хоть и больше возможностей, но синтаксис не всем приятен, вот пример на JScript:
MyObject.SayHi ();
function MyObject::MyEvent()
{
  MyObject.SayHi2 ();
}


для того, чтобы это заработало, пример надо немного изменить (нашел в форуме) C++ часть:
class ATL_NO_VTABLE CMyObject : 
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CMyObject, &CLSID_MyObject>,
    public IConnectionPointContainerImpl<CMyObject>,
    public IDispatchImpl<IMyObject, &IID_IMyObject, &LIBID_ATLCLIENTAPPLib>,
    public CProxy_IMyObjectEvents< CMyObject >,
    public IProvideClassInfo2Impl<&CLSID_MyObject, &IID_IMyObject, &LIBID_ATLCLIENTAPPLib>
{
...
BEGIN_COM_MAP(CMyObject)
  COM_INTERFACE_ENTRY(IMyObject)
  COM_INTERFACE_ENTRY(IDispatch)
  COM_INTERFACE_ENTRY(IConnectionPointContainer)
  COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer)
  COM_INTERFACE_ENTRY(IProvideClassInfo2)
  COM_INTERFACE_ENTRY2(IProvideClassInfo, IProvideClassInfo2)
END_COM_MAP()
...
Re[2]: Встраивание Windows Scripting в свои приложения
От: bugmonster Россия  
Дата: 20.09.05 12:58
Оценка: 3 (1)
Здравствуйте, SVV, Вы писали:

SVV>а возможность создавать стандартные ActiveXObject: FileSystemObject, Shell, примерно таким способом:

SVV>
SVV>var    fso, Sh;
SVV>fso = new ActiveXObject("Scripting.FileSystemObject");
SVV>Sh = new ActiveXObject("WScript.Shell");
SVV>

SVV>???

Если скачать свежую версию скрипт-движка с microsoft.com, (ЕМНИП я качал в прошлом году версию 5.6), то ничего добавлять не нужно будет.
Приведённый код будет выполняться даже под вашим приложением.
Re[3]: Встраивание Windows Scripting в свои приложения
От: SVV Беларусь  
Дата: 27.03.06 13:59
Оценка:
...
SVV>>
SVV>>var    fso, Sh;
SVV>>fso = new ActiveXObject("Scripting.FileSystemObject");// 2
SVV>>Sh = new ActiveXObject("WScript.Shell");// 3
SVV>>

...
B>Если скачать свежую версию скрипт-движка с microsoft.com, (ЕМНИП я качал в прошлом году версию 5.6), то ничего добавлять не нужно будет.
B>Приведённый код будет выполняться даже под вашим приложением.

Эксперименты:
В общем-то у меня всегда стояла последняя версия ScriptEngine — 5.6 (до сих пор (27 марта 2006) ничего новее нет).
Вначале я экспериментировал с командой:
WScript.Echo ("111");

и мне выдавалось сообщение: 'WScript' is undefined.
строка 2 из примера отрабатывает и с помощью fso далее можно удалять файлы с диска, но вот со строкой 3 возникают проблемы: 'WScript' is undefined.
попытка подсунуть строку:
ws = new ActiveXObject("Scripting.WScript");// 4

приводит к сообщению: Automation server can't create object

WScript нужен т.к. с его помощью можно создать много других полезных объектов.
Вопрос:
можно ли как-то заставить скрипт "видеть" 'WScript'?
Re[4]: Встраивание Windows Scripting в свои приложения
От: Left2 Украина  
Дата: 27.03.06 14:51
Оценка: 2 (1)
SVV>WScript нужен т.к. с его помощью можно создать много других полезных объектов.
SVV>Вопрос:
SVV>можно ли как-то заставить скрипт "видеть" 'WScript'?

Нет. Он реализуется в cscript.exe/wscript.exe и наружу не выставляется.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: Встраивание Windows Scripting в свои приложения
От: SVV Беларусь  
Дата: 28.03.06 06:58
Оценка:
Здравствуйте, Left2, Вы писали:

...
SVV>>можно ли как-то заставить скрипт "видеть" 'WScript'?

L>Нет. Он реализуется в cscript.exe/wscript.exe и наружу не выставляется.

может быть есть ссылка на какую-нибудь статью где об этом написано?

Но если все же не получится заставить скрипт "видеть" 'WScript', можно все-таки получить доступ к объекту Shell:
Sh = new ActiveXObject("WScript.Shell");

???
Доступ к объекту Shell в скрипте (запускаемом cscript.exe/wscript.exe) реализуется через объект WScript...
Re[6]: Встраивание Windows Scripting в свои приложения
От: Left2 Украина  
Дата: 28.03.06 08:42
Оценка: 2 (1)
L>>Нет. Он реализуется в cscript.exe/wscript.exe и наружу не выставляется.
SVV>может быть есть ссылка на какую-нибудь статью где об этом написано?

Честно говоря не знаю, вполне может быть что об этом где-то и написано — для меня это следует из логики того как работает ActiveScripting. Он позволяет подсунуть "глобальные имена" (не помню точно как это называется в его терминологии) — но это просто IDispatch интерфейсы которые видны в скрипте глобально. Приложение которое хостит ActiveScript может подсунуть туда любые имена. К примеру, IE подсовывает window, document и т.п. А WSH подсовывает WScript. При этом этот IDispatch вовсе не обязан быть где-то зарегистрирован в системе.

В принципе, поскольку есть 2 приложения которые реализуют обьект WSCript похожим образом (wscript.exe и cscript.exe) — то есть вероятность что функциональность обьекта WScript как-то зашарена между ними. Но лично мне найти возможность использования (документированную или недокументированную) обьекта WScript за пределами его хостов не удалось. К тому же, некоторые вещи реализованы в cscript и wscript по-разному (к примеру, WScript.Echo) — так что велика вероятность того что функциональность WScript шарится как-нибудь "по кусочкам" или вообще засунута в статическую библиотеку и статически прилинкована к каждому их хостов. Для меня в своё время оказалось проще реализовать функциональность предоставляемую WScript в своём глобальном обьекте.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[7]: Встраивание Windows Scripting в свои приложения
От: SVV Беларусь  
Дата: 28.03.06 08:50
Оценка:
Здравствуйте, Left2, Вы писали:

...
L>>Для меня в своё время оказалось проще реализовать функциональность предоставляемую WScript в своём глобальном обьекте.
Похоже что и я пойду тем же путем, реализовать WScript.Echo я уже заменил, но вот как быть с такой строкой непонятно:
Sh = new ActiveXObject("WScript.Shell");

может есть идеи?

Я немного поэкспериментировал и выяснилось что из встроенного скрипта доступна работа с WMI объектами, с офисными вещами (Excel.Application), а также возможно
MyObj = new ActiveXObject("MyObj.My");

где "MyObj.My" это написанный и зарегистрированный по правилам Com объект...
Re[8]: Встраивание Windows Scripting в свои приложения
От: Left2 Украина  
Дата: 28.03.06 09:08
Оценка: 2 (1)
SVV>Похоже что и я пойду тем же путем, реализовать WScript.Echo я уже заменил, но вот как быть с такой строкой непонятно:
Sh = new ActiveXObject("WScript.Shell");

SVV>может есть идеи?

Такое должно работать — WScript.Shell это зарегистрированный в системе COM-обьект.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[9]: Встраивание Windows Scripting в свои приложения
От: Left2 Украина  
Дата: 28.03.06 09:23
Оценка:
L>Такое должно работать — WScript.Shell это зарегистрированный в системе COM-обьект.

Вот такое вот — точно будет работать
var fso = new ActiveXObject("Scripting.FileSystemObject");
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[8]: Встраивание Windows Scripting в свои приложения
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 28.03.06 09:29
Оценка: 2 (1)
Здравствуйте, SVV, Вы писали:

SVV>Здравствуйте, Left2, Вы писали:


SVV>...

L>>>Для меня в своё время оказалось проще реализовать функциональность предоставляемую WScript в своём глобальном обьекте.
SVV>Похоже что и я пойду тем же путем, реализовать WScript.Echo я уже заменил,

var wsh = new ActiveXObject("WScript.Shell");
wsh.Popup( "Hello" );

SVV>но вот как быть с такой строкой непонятно:

SVV>
SVV>Sh = new ActiveXObject("WScript.Shell");
SVV>

SVV>может есть идеи?

у меня работает (мой exe загружает wsc-файл)
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[9]: Встраивание Windows Scripting в свои приложения
От: SVV Беларусь  
Дата: 28.03.06 10:37
Оценка:
Здравствуйте, Odi$$ey, Вы писали:

...
SVV>>
SVV>>Sh = new ActiveXObject("WScript.Shell");
SVV>>

SVV>>может есть идеи?

OE>у меня работает (мой exe загружает wsc-файл)

Да, я был неправ, объект Shell создался и его метод Popup работает. Я неправильно проверял, посчитав что если WScript.Echo ругнулся "'WScript' is undefined", то и объект Shell не создался...

Всем спасибо за помощь.
Re: Встраивание Windows Scripting в свои приложения
От: orefkov  
Дата: 31.03.06 06:14
Оценка:
Хорошая статья.
Не мешало бы ее расширить обзором добавления поддержки отладки скриптов.
Re[2]: Встраивание Windows Scripting в свои приложения
От: Left2 Украина  
Дата: 31.03.06 07:57
Оценка:
O>Хорошая статья.
O>Не мешало бы ее расширить обзором добавления поддержки отладки скриптов.

В смысле, ты имеешь в виду написание собственного Debugger-а для скриптов (встроенного в твоё приложение)?
Или возможность подключаться внешним дебаггером для отладки скриптов?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Встраивание Windows Scripting в свои приложения
От: orefkov  
Дата: 31.03.06 08:12
Оценка:
Здравствуйте, Left2, Вы писали:

L>В смысле, ты имеешь в виду написание собственного Debugger-а для скриптов (встроенного в твоё приложение)?

L>Или возможность подключаться внешним дебаггером для отладки скриптов?
Нет, там надо тривиально реализовать интерфейс IActiveScriptSiteDebug,
и после этого к скрипту может коннектится любой скрипт-отладчик, зарегенный в системе,
например, VS.NET, MS ScriptDebugger и тп.
Попробуй например запустить какой нибудь скрипт вот так:
wscript //X myscript.vbs
или в скрипте на VBScript напиши в желаемом месте останова stop,
и запусти скрипт так:
wscript //D myscript.vbs
Re[4]: Встраивание Windows Scripting в свои приложения
От: Left2 Украина  
Дата: 31.03.06 08:33
Оценка:
O>Нет, там надо тривиально реализовать интерфейс IActiveScriptSiteDebug,
O>и после этого к скрипту может коннектится любой скрипт-отладчик, зарегенный в системе,
O>например, VS.NET, MS ScriptDebugger и тп.
O>Попробуй например запустить какой нибудь скрипт вот так:
O>wscript //X myscript.vbs
O>или в скрипте на VBScript напиши в желаемом месте останова stop,
O>и запусти скрипт так:
O>wscript //D myscript.vbs

Это-то я как раз знаю Я поинтересовался что ты имел в виду когда говорил о том что "Не мешало бы ее расширить обзором добавления поддержки отладки скриптов." ?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: Встраивание Windows Scripting в свои приложения
От: orefkov  
Дата: 31.03.06 08:42
Оценка:
Здравствуйте, Left2, Вы писали:

L>Это-то я как раз знаю Я поинтересовался что ты имел в виду когда говорил о том что "Не мешало бы ее расширить обзором добавления поддержки отладки скриптов." ?


Аааа...
Имел ввиду я таки простенькую реализацию IActiveScriptSiteDebug
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.