如何从VBScript调用Windows服务的方法



假设我创建了一个Windows服务,公开了一个方法foo(param1 as string)

是否可以以某种方式直接从VBScript调用foo("SomeAwesomeString")(即,无需启动额外的进程)?

用例如下:我正试图为hMailServer(hMS)编写一个"扩展"应用程序,但hMS只能在事件发生时调用VBscript脚本。每次事件发生时,我都可以让VBscript启动.exe,但处理过程涉及打开和关闭与后端数据库的连接。因此,每次调用都非常昂贵。我一直在想,我可以通过使用服务来维护连接来减少费用(即,打开一次,如果连接关闭,则重新打开)。此外,通过将处理实现为后台工作线程,将实现无阻塞处理+减少进程启动开销。


更新:我是怎么做到的

Whew。经过大量的搜索和实验,我想我找到了一种方法。我会把它作为答案发布在下面。如果有人能给出比我更好的答案,请随意发帖。如果确实更好,我会解开我的答案,给你的答案打上记号。


小更新/勘误表:

我忘了告诉你Windows服务是用VB.Net 2010创建的。很抱歉


最后更新:我放弃

在互联网上搜索了所有的东西,并且尝试了无数次之后,我放弃了。

我决定公开该方法,而是使用命名管道。现在,VBScript脚本只需要写入一个向//./pipe/PIPENAME打开的FSO,并让服务弄清楚VBScript想要什么。

无论如何,谢谢你的帮助,朋友们。

您可以将这两种方法结合起来。

按照您的建议实施您的服务,以保持必要的连接。

然后,从VBScript调用一个微小的.exe,其全部目的是将其命令行参数传递给上述服务。

事实上,与其为每个api创建不同的.exe(例如,"hms-foo.exe"、"hms-bar.exe"或其他什么),不如将api的名称作为另一个命令行参数。

现在,您可能有一个非常简单的.exe,比如hms.com.exe,VBScript可以用命令行调用它,比如"hms.com.exefooSomeAweSomString"。在内部,hms.com.exe将使用参数"SomeAweSomString"调用导出的API,foo()。

更好的方法是在DLL而不是.exe中实现上述功能,并使用标准rundll32.exe以命令行参数作为参数调用DLL的入口点,然后所述功能与服务通信,如上面针对.exe.所述

这将使用户更难通过意外双击.exe文件来虚假地调用您的服务,因为不会有.exe文件。

是的,请检查WCF,它将在两个程序之间混合。

好吧,下面是我的操作方法:

  1. <ComClass(), ProgId("ServiceName")>属性标记要公开的类

  2. 检查"使组件COM可见";项目属性中的复选框>应用程序>装配信息

  3. 使Service Installer类成为

  4. 发布

  5. 使用InstallUtil.exe进行部署。例如:

    C:WINDOWSMicrosoft.NETFrameworkv4.0.30319InstallUtil.exe <appname>.exe.deploy
    
  6. 使用regasm发布COM接口。例如:

    C:WINDOWSMicrosoft.NETFrameworkv4.0.30319regasm <appname>.exe.deploy /codebase <progid>
    
  7. 完成!

现在我可以使用COM接口调用服务,例如:

Dim objService
Set objService = CreateObject("ServiceName")
Dim rslt
rslt = objService.Foo("SomeAwesomeString")

哇!太多的障碍需要跨越:-/


更新:失败

经过一些测试。。。我发现CreateObject ed实例是而不是与当前运行的服务叹息相同。

我会做更多的实验。

以下是我如何做与您尝试做的事情完全相同的事情-是的,这是hMailServer的一个助手应用程序,用于筛选电子邮件的收件人,并在不允许任何收件人的情况下拒绝邮件。我让vbscript做了同样的事情,但大约1%的邮件无法送达,因为vbscript错误地显示"未找到DSN"——DSN是指向有规则的数据库的链接。由于我无法解决这个问题,我想到了一个助手应用程序,它将从hmail的OnAcceptMessage事件中调用。我会将发件人ID和收件人传递到我的应用程序,然后我会收到一条带解释的ok或not ok消息。

我做这件事的方法是创建一个TCP服务器应用程序,它在预定义的端口上侦听。创建一个winsock对象来在传递发送方/接收方的vbscript中与服务器对话。由于服务器是持久的,因此不会重复调用exe或打开/关闭DB连接。

以下是一些很好的资源:http://www.vbforums.com/showthread.php?453366-如何感知一个简单字符串-via-TCP

https://www.symantec.com/connect/downloads/protocolvbs-windows-vbscript-test-tcp-service-response

我希望我能得到作者的回复,毕竟这个问题发布才7年9个月:)

最新更新