如何从 VBScript 获取值到我的 C++ 主机?
How to get a value from a VBScript to my C++ host?
我正在尝试从 C++ ATL 控制台应用程序(非 VBS 文件,而只是嵌入在我的代码中的脚本)执行 VBScript 并从中取回字符串。
我试过这样的事情:
HRESULT hr = S_OK;
CComVariant result;
EXCEPINFO ei = { };
LPCOLESTR sCmd = L"s = \"something\"\r\n"
"WScript.Echo s\r\n";
hr = spVBScriptParse->ParseScriptText(sCmd, NULL, NULL, NULL, 0, 0, 0, &result, &ei);
std::cout << "got:" << result.cVal << std::endl;
另请参阅此问题以了解如何进行设置:
How to load & call a VBScript function from within C++?
如果我 运行 这个,VBScript 会抱怨 "WScript" 对象不存在。
我尝试用 MsgBox
替换 WScript.Echo
并且代码工作正常(但当然不会返回字符串)。
我试过用这个:
LPCOLESTR sCmd = L"s = \"something\"\r\n"
"Set fso = CreateObject (\"Scripting.FileSystemObject\")\r\n"
"Set stdout = fso.GetStandardStream (1)\r\n"
"stdout.WriteLine s\r\n"
这会将我的字符串写入启动 C++ 应用程序的控制台,但不要 return 将该字符串返回到我的代码。
如何从脚本中获取 s
的值到我的主机进程中?
澄清一下:我不想保存 VBS,而不是将字符串保存到临时文件。
目标是在没有磁盘访问的情况下将所有内容保存在内存中。
我知道我可以利用注册表,但我想避免提升。不知道某些内存共享是否适用于 vbscript。
另一个想法是命名管道,但我不知道如何在 c++ 和 vbscript 之间共享一个。
只需添加对 ParseScriptText
的第二次调用,将您的字符串变量计算为表达式。
您必须将 SCRIPTTEXT_ISEXPRESSION
作为 dwFlags
参数传递,以便脚本引擎知道您想要获取表达式的值。
这也在 ParseScriptText 的官方文档中:
https://docs.microsoft.com/en-us/scripting/winscript/reference/iactivescriptparse-parsescripttext
我测试了它 in Delphi,它的效果非常好:
procedure TestActiveScripting;
const
SCRIPTTEXT_ISEXPRESSION = [=10=]000020;
var
hr: HResult;
ScriptSite: IActiveScriptSite;
VBScript: IActiveScript;
VBScriptParse: IActiveScriptParse;
res: Variant;
ei: TExcepInfo;
begin
// Initialize
ScriptSite := TSimpleScriptSite.Create as IActiveScriptSite;
hr := CoCreateInstance(CLSID_VBScript, nil, CLSCTX_INPROC_SERVER, IID_IActiveScript, VBScript);
hr := VBScript.SetScriptSite(ScriptSite);
VBScriptParse := VBScript as IActiveScriptParse;
hr := VBScriptParse.InitNew;
// Run some scripts
hr := VBScriptParse.ParseScriptText('s = "something"', nil, nil, nil, 0, 0, 0, @res, ei);
hr := VBScriptParse.ParseScriptText('s', nil, nil, nil, 0, 0, SCRIPTTEXT_ISEXPRESSION, @res, ei);
ShowMessage(res);
end;
我正在尝试从 C++ ATL 控制台应用程序(非 VBS 文件,而只是嵌入在我的代码中的脚本)执行 VBScript 并从中取回字符串。
我试过这样的事情:
HRESULT hr = S_OK;
CComVariant result;
EXCEPINFO ei = { };
LPCOLESTR sCmd = L"s = \"something\"\r\n"
"WScript.Echo s\r\n";
hr = spVBScriptParse->ParseScriptText(sCmd, NULL, NULL, NULL, 0, 0, 0, &result, &ei);
std::cout << "got:" << result.cVal << std::endl;
另请参阅此问题以了解如何进行设置:
How to load & call a VBScript function from within C++?
如果我 运行 这个,VBScript 会抱怨 "WScript" 对象不存在。
我尝试用 MsgBox
替换 WScript.Echo
并且代码工作正常(但当然不会返回字符串)。
我试过用这个:
LPCOLESTR sCmd = L"s = \"something\"\r\n"
"Set fso = CreateObject (\"Scripting.FileSystemObject\")\r\n"
"Set stdout = fso.GetStandardStream (1)\r\n"
"stdout.WriteLine s\r\n"
这会将我的字符串写入启动 C++ 应用程序的控制台,但不要 return 将该字符串返回到我的代码。
如何从脚本中获取 s
的值到我的主机进程中?
澄清一下:我不想保存 VBS,而不是将字符串保存到临时文件。
目标是在没有磁盘访问的情况下将所有内容保存在内存中。
我知道我可以利用注册表,但我想避免提升。不知道某些内存共享是否适用于 vbscript。
另一个想法是命名管道,但我不知道如何在 c++ 和 vbscript 之间共享一个。
只需添加对 ParseScriptText
的第二次调用,将您的字符串变量计算为表达式。
您必须将 SCRIPTTEXT_ISEXPRESSION
作为 dwFlags
参数传递,以便脚本引擎知道您想要获取表达式的值。
这也在 ParseScriptText 的官方文档中:
https://docs.microsoft.com/en-us/scripting/winscript/reference/iactivescriptparse-parsescripttext
我测试了它 in Delphi,它的效果非常好:
procedure TestActiveScripting;
const
SCRIPTTEXT_ISEXPRESSION = [=10=]000020;
var
hr: HResult;
ScriptSite: IActiveScriptSite;
VBScript: IActiveScript;
VBScriptParse: IActiveScriptParse;
res: Variant;
ei: TExcepInfo;
begin
// Initialize
ScriptSite := TSimpleScriptSite.Create as IActiveScriptSite;
hr := CoCreateInstance(CLSID_VBScript, nil, CLSCTX_INPROC_SERVER, IID_IActiveScript, VBScript);
hr := VBScript.SetScriptSite(ScriptSite);
VBScriptParse := VBScript as IActiveScriptParse;
hr := VBScriptParse.InitNew;
// Run some scripts
hr := VBScriptParse.ParseScriptText('s = "something"', nil, nil, nil, 0, 0, 0, @res, ei);
hr := VBScriptParse.ParseScriptText('s', nil, nil, nil, 0, 0, SCRIPTTEXT_ISEXPRESSION, @res, ei);
ShowMessage(res);
end;