如何在Qt应用程序中运行VBScript而不涉及cscript.exe或wscript.exe?

时间:2011-12-15 12:57:47

标签: qt vbscript

我正在编写一个调用QProcess :: startDetached(“wscript.exe script.vbs”)的Qt应用程序,以在Windows中显示删除确认对话框。

这是剧本:

Set objShell = CreateObject("Shell.Application") 
Set objFolder = objShell.Namespace("-") 
Set objFolderItem = objFolder.ParseName("-") 
objFolderItem.InvokeVerb("Delete")

Namespace和ParseName的参数来自传递给脚本的参数。

这可能效率低下,因为它在运行脚本之前首先打开外部应用程序。我想知道我是否可以在Qt应用程序中运行VBScripts。

如果没有,我可以做什么选择?

2 个答案:

答案 0 :(得分:2)

我的VBScript非常弱,所以我不能100%确定我理解你要做的事情。我的假设是您正在尝试删除文件夹,但希望在操作发生时为用户提供正常的确认框和动画。如果这不正确,请告诉我,我将删除此答案。

一些想法:

  • 您可以在C ++代码中调用Windows API目录来执行此操作。我相信正确的电话会是使用IFileOperation(Vista及更高版本)或SHFileOperation(Vista之前)
  • Qt已经有消息框对话框。虽然您可能无法获得与本机shell相同的完全功能,但您可以使用此(QMessageBox :: warning),然后使用QDir删除该文件夹。这也是跨平台的便携式。
  • 如果你坚持使用VBScript,我怀疑你会看到任何性能问题,除非在循环中多次调用它。你知道,旧的“过早优化是所有邪恶的根源”。

答案 1 :(得分:0)

您应该阅读IActiveScript COM接口。您可以创建实现IActiveScript的解释器实例,以提供用于评估脚本的运行时。 VBScript和JScript都可用于此,许多其他第三方脚本语言也提供IActiveScript支持。

使用它的概述是您创建语言运行时(例如VBScript的实例),然后向其添加一些自定义对象。通常,如果要将解释器嵌入到应用程序中,那么公开Application对象是一个很好的起点。这可以只是一个IDispatch接口或更具体的IDL生成的类型库和所有修剪。将必要的命名项添加到运行时后,您将加载一个或多个脚本。现在,当您将其状态切换为活动状态或正在运行时,脚本中声明的任何公共函数或子例程都将通过实时运行时的IDispatch接口公开。为了实际运行脚本程序,我为我的东西调用Main函数 - 你可以选择一些适用于你的环境的其他方案。

ActiveScripting的优点是更改语言,只需更改运行时CLSID即可。因此,如果人们更喜欢Perl,他们可以使用PerlScript或PythonScript等。您的Application对象保持不变,因此您不必编写其他代码来支持新语言。唯一的要求是一切都是COM。