JScript 和 Windows 服务之间的通信方式

Ways to communicate between JScript and Windows service

本文关键字:通信 方式 之间 服务 Windows JScript      更新时间:2023-10-16

我有一个Windows本地服务,它可能会生成一个进程,通过Windows脚本主机执行JScript脚本(在.js文件中)。问题是我需要将脚本在.js文件中生成的结果通知我的服务。传输或简单的 32 位整数或字符串就足够了。有什么方法可以做到这一点?

附言。该代码必须在 Windows XP SP3 或更高版本的操作系统上运行。

最好的办法是创建一个在服务中执行的进程外 COM 对象。只需实现必要的脚本接口并提供一个成员函数来匹配通知,并从脚本中调用它,如下所示:

newObj = new ActiveXObject("localserver.mynotify");
newObj.Notify("finished");

进程的退出代码是否足够?

Windows 脚本主机具有允许您设置退出代码的.Quit(errorCode)方法。您应该能够直接从服务调用 WSH,并通过传递生成后收到的进程句柄来获取带有 GetProcessExitCode() 的返回代码。

请注意,从 JScript 文件中可以执行的几乎所有操作也可以使用本机代码完成。

是否必须将.js文件作为外部进程执行? Windows 脚本具有 COM 对象,应用可以使用这些对象在其自己的进程中运行脚本。 我使用它在我的服务进程中执行脚本文件,它工作正常。 宿主进程甚至可以实现自己的基于 IDispatch 的类,并将它们传递给脚本引擎,以作为全局对象向脚本公开,以便脚本可以与宿主进程通信,而无需使用 new ActiveXObjectCreateObject()来访问这些对象。

我看到你的脚本是用 JScript 编写的,你的应用程序是用 C++ 编写的。

也许完成所需操作的最简单方法是将文件写入服务应有权访问的 programdata 文件夹。也许对特定请求使用 GUID,将其传递给 JScript,以便保证它是一个唯一的文件。不理想。

获取 JScript 输出的另一种方法...你能调用托管代码 (C#) 吗?如果是这样,您可以使用 .基于 NET 或 .NET 可调用的 JavaScript 编译器/解释器。这将允许您避免 IActiveScript,还可以直接从脚本上下文或函数返回中获取值。我用过Jurassic和JavaScriptDotNet,它们都非常易于使用和扩展。

如果您严重依赖 ActiveXObject 调用(即:文件系统对象)并且不想编写组件,这可能会带来问题。JuraScript包装了侏罗纪引擎,并为其添加了ActiveXObject支持以实现COM自动化。

我是一个C++新手,所以我不知道这对你来说有多大的飞跃,尽管我知道可以在托管/C++之间互操作。

只是想我会提到这些场景,因为我没有看到它们列在答案中。