要让引擎开始执行代码,宿主程序必须强制引擎进入开始状态。因为非持续性的引擎不会带有任何
解析了的初始化脚本进入开始状态,所以这样调用SetScriptState不会有任何作用,除非激活并行
的解析操作。要向引擎填充脚本代码,宿主程序可以使用引擎的ParseScriptText方法。下面的代码
说明如何将两段VBScript代码段添加到引擎:
OLECHAR wszScript1[] = L"Sub Foo()\n"
L" MsgBox \"Hello!\"\n"
L"End sub";
OLECHAR wszScript2[] = L"Foo\n"
L"MsgBox \"Do it now!\"\n";
HRESULT AddCodeToEngine(IActiveScriptParse *pas) {
HRESULT hr;
// add wszScript1 to engine's namespace
hr = pas->ParseScriptText(wszScript1, 0, 0, 0,
0, 0, SCRIPTTEXT_ISVISIBLE, 0, 0);
if (FAILED(hr)) return hr;
// execute statement(s) in wszScript2
hr = pas->ParseScriptText(wszScript2, 0, 0, 0,
0, 0, SCRIPTTEXT_ISVISIBLE, 0, 0);
return hr;
}
ParseScriptText的第一个调用简单的添加Foo过程定义到引擎的运行时状态。它将在后来被
ParseScriptText解析的脚本声明中可用,正如第二个ParseScriptText调用中那样。这些都是由
引擎的IDispatch接口完成的,IDispatch接口可以通过GetScriptDispatch方法得到。dispatch接口
在脚本文本被解析时由引擎动态创建,而且它每一个被解析的过程声明导出为基于IDispatch的方法,
这些方法可以通过GetIDsOfNames/Invoke调用。下面的代码可以用来执行一个已经在前面由
ParseScriptText解析的Foo过程调用:
HRESULT DoFoo(IActiveScript *pas)
{
IDispatch *pd = 0;
HRESULT hr = pas->GetScriptDispatch(0, &pd);
if (SUCCEEDED(hr)) {
DISPID id; OLECHAR *rgwsz [] = { L"Foo" };
// look up Sub name
hr = pd->GetIDsOfNames(IID_NULL, rgwsz, 1,
0, &id);
DISPPARAMS dp = { 0, 0, 0, 0 };
// call Foo script
if (SUCCEEDED(hr))
hr = pd->Invoke(id, IID_NULL, 0,
DISPATCH_METHOD, &dp,
0, 0, 0);
pd->Release();
}
return hr;
}
因为脚本代码可以被添加若干次(IE 3.0每次遇到", // end delimiter
0, // cookie
0, // line number of 1st line
0, // flags
&bstrName, // real name
0); // EXCEPINFO
AddScriptlet在将任意脚本声明绑定到基于程序的事件时很有用。
下面的代码说明了一个简单的脚本宿主程序,用户可以从命令行上运行任意的脚本。程序中暴露出
了一个名叫shell的对象。shell对象支持IShell接口,使得脚本可以访问控制台的标准输出,并且
提供了运行任意程序的功能。shell对象还支持对外接口,IShellNotify,定义了事件当行结束字符
被写到控制台或游戏程序运行时用来通知脚本。在eval.cpp中,注意脚本语言是命令行的第一个参数,
以及一个或多个可以被解析的脚本文件。需要其中一个脚本文件定义main过程,它一旦被执行,所有
的脚本都被解析,shell对象也被连接完毕。
正如eval程序描述的那样,它直接在程序内部通过Active Scripting支持脚本。基本脚本的执行只需要
很少的工作,而事实上不需要任何真正的交互性的工作除非你需要让你的自动化接口对用户脚本来说可
用。一旦你的程序在暴露自动化接口给外部脚本客户使用时遇到问题,可以实现GetItemInfo方法来使得
用户脚本可以使用程序的命名空间。要让程序定义的事件可脚本化(可以由脚本使用)需要程序的自动化
对象通过连接点支持对外的dispatch接口。
Acronis Cyber Protect/Backup Remote Code Execution
-
The Acronis Cyber Protect appliance, in its default configuration, allows
the anonymous registration of new protect/backup agents on new endpoints.
This AP...
1 年前
没有评论:
发表评论