Аннотация:
ATL постепенно становится все более популярным в среде программистов, и пример встраивания поддержки скриптов в приложения мы приведем на этой основе. ATL — одна из самых низкоуровневых библиотек С++, и на ее примере хорошо видны подробности процесса. С помощью Microsoft ActiveX Scripting вы можете относительно просто использовать скрипты в ATL-приложениях. В этой статье показано, как создать новое или модифицировать уже имеющееся ATL-приложение для поддержки VBScript.
а можно ли добавить не конкретный объект:
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");
...
Примеры в статье даны для 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 в свои приложения
Здравствуйте, 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>>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 в свои приложения
SVV>WScript нужен т.к. с его помощью можно создать много других полезных объектов. SVV>Вопрос: SVV>можно ли как-то заставить скрипт "видеть" 'WScript'?
Нет. Он реализуется в cscript.exe/wscript.exe и наружу не выставляется.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: Встраивание Windows Scripting в свои приложения
... SVV>>можно ли как-то заставить скрипт "видеть" 'WScript'?
L>Нет. Он реализуется в cscript.exe/wscript.exe и наружу не выставляется.
может быть есть ссылка на какую-нибудь статью где об этом написано?
Но если все же не получится заставить скрипт "видеть" 'WScript', можно все-таки получить доступ к объекту Shell:
Sh = new ActiveXObject("WScript.Shell");
???
Доступ к объекту Shell в скрипте (запускаемом cscript.exe/wscript.exe) реализуется через объект WScript...
Re[6]: Встраивание Windows Scripting в свои приложения
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 в свои приложения
... L>>Для меня в своё время оказалось проще реализовать функциональность предоставляемую WScript в своём глобальном обьекте.
Похоже что и я пойду тем же путем, реализовать WScript.Echo я уже заменил, но вот как быть с такой строкой непонятно:
Sh = new ActiveXObject("WScript.Shell");
может есть идеи?
Я немного поэкспериментировал и выяснилось что из встроенного скрипта доступна работа с WMI объектами, с офисными вещами (Excel.Application), а также возможно
MyObj = new ActiveXObject("MyObj.My");
где "MyObj.My" это написанный и зарегистрированный по правилам Com объект...
Re[8]: Встраивание Windows Scripting в свои приложения
Здравствуйте, 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>>Sh = new ActiveXObject("WScript.Shell");
SVV>>
SVV>>может есть идеи?
OE>у меня работает (мой exe загружает wsc-файл)
Да, я был неправ, объект Shell создался и его метод Popup работает. Я неправильно проверял, посчитав что если WScript.Echo ругнулся "'WScript' is undefined", то и объект Shell не создался...
Всем спасибо за помощь.
Re: Встраивание Windows Scripting в свои приложения
O>Хорошая статья. O>Не мешало бы ее расширить обзором добавления поддержки отладки скриптов.
В смысле, ты имеешь в виду написание собственного Debugger-а для скриптов (встроенного в твоё приложение)?
Или возможность подключаться внешним дебаггером для отладки скриптов?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Встраивание Windows Scripting в свои приложения
Здравствуйте, Left2, Вы писали:
L>В смысле, ты имеешь в виду написание собственного Debugger-а для скриптов (встроенного в твоё приложение)? L>Или возможность подключаться внешним дебаггером для отладки скриптов?
Нет, там надо тривиально реализовать интерфейс IActiveScriptSiteDebug,
и после этого к скрипту может коннектится любой скрипт-отладчик, зарегенный в системе,
например, VS.NET, MS ScriptDebugger и тп.
Попробуй например запустить какой нибудь скрипт вот так:
wscript //X myscript.vbs
или в скрипте на VBScript напиши в желаемом месте останова stop,
и запусти скрипт так:
wscript //D myscript.vbs
Re[4]: Встраивание Windows Scripting в свои приложения
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 в свои приложения
Здравствуйте, Left2, Вы писали:
L>Это-то я как раз знаю Я поинтересовался что ты имел в виду когда говорил о том что "Не мешало бы ее расширить обзором добавления поддержки отладки скриптов." ?
Аааа...
Имел ввиду я таки простенькую реализацию IActiveScriptSiteDebug