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

时间:2012-08-07 21:22:06

标签: c++ winapi windows-services wsh jscript

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

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

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:0)

您是否必须将.js文件作为外部进程执行? Windows Scripting具有COM对象,应用程序可以使用该对象在其自己的进程中运行脚本。我使用它在我的服务进程中执行脚本文件,它工作正常。托管进程甚至可以实现自己的基于IDispatch的类,并将它们传递给脚本引擎,以将脚本作为全局对象公开,这样脚本就可以与托管进程通信,而无需使用new ActiveXObject或{ {1}}访问这些对象。

答案 3 :(得分:0)

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

也许最简单的方法就是将一个文件编写到您的服务应该有权访问的programdata文件夹中。也许对特定请求使用GUID,将其传递给JScript,以确保它是一个唯一的文件。不理想。

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

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

我是一个C ++ newb,所以我不知道这对你有多大的飞跃,虽然我知道可以在托管/ C ++之间进行交互。

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