我有一个 Windows 本地服务,它可能会产生一个通过 Windows 脚本主机执行 JScript 脚本(在 .js 文件中)的进程。问题是我需要将 .js 文件中脚本生成的结果通知我的服务。传输或简单的 32 位整数或字符串就足够了。这样做的方法是什么?
PS。代码必须在 Windows XP SP3 或更高版本的操作系统上运行。
我有一个 Windows 本地服务,它可能会产生一个通过 Windows 脚本主机执行 JScript 脚本(在 .js 文件中)的进程。问题是我需要将 .js 文件中脚本生成的结果通知我的服务。传输或简单的 32 位整数或字符串就足够了。这样做的方法是什么?
PS。代码必须在 Windows XP SP3 或更高版本的操作系统上运行。
您最好的选择是创建一个在您的服务中执行的进程外 COM 对象。只需实现必要的脚本接口并提供一个成员函数来匹配通知并从您的脚本中调用它,如下所示:
newObj = new ActiveXObject("localserver.mynotify");
newObj.Notify("finished");
进程的退出代码就足够了吗?
Windows 脚本宿主有一个.Quit(errorCode)
方法可以让您设置退出代码。您应该能够直接从服务调用 WSH 并GetProcessExitCode()
通过传递您在生成它后收到的进程句柄来获取返回代码。
请注意,您可以从 JScript 文件执行的几乎所有操作也可以使用本机代码完成。
您是否必须将 .js 文件作为外部进程执行?Windows 脚本具有 COM 对象,应用程序可以使用这些对象在其自己的进程中运行脚本。我用它在我的服务进程中执行脚本文件,它工作正常。宿主进程甚至可以实现它自己IDispatch
的基于类并将它们传递给脚本引擎以将脚本作为全局对象公开,这样脚本就可以与宿主进程通信,而无需使用new ActiveXObject
或CreateObject()
访问这些对象。
我看到您的脚本是用 JScript 编写的,而您的应用程序是用 C++ 编写的。
也许完成您想要的最简单的方法是将文件写入您的服务应该有权访问的 programdata 文件夹。可能对特定请求使用 GUID,将其传递给 JScript,以保证它是唯一的文件。不理想。
获取 JScript 输出的另一种方法...您可以调用托管代码 (C#) 吗?如果是这样,您可以使用基于 .NET 或 .NET 可调用的 JavaScript 编译器/解释器。这将允许您避免 IActiveScript,并且还可以直接从脚本上下文或函数返回中获取值。我使用过Jurassic和JavaScriptDotNet,它们都非常易于使用和扩展。
如果您严重依赖 ActiveXObject 调用(即:FileSystemObject)并且不想编写组件,这可能会引发问题。JuraScript封装了侏罗纪引擎并为其添加了 ActiveXObject 支持以实现 COM 自动化。
我是一个 C++ 新手,所以我不知道这对你来说有多大的飞跃,尽管我知道托管/C++ 之间可以进行互操作。
只是想我会提到这些场景,因为我没有在答案中看到它们。