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

时间:2011-05-25 14:12:13

标签: .net vb.net com windows-services vbscript

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

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

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


更新:我是怎么做的

呼。在 批次 的搜索和实验之后,我想我找到了一种方法。我将在下面发布它作为答案。如果有人能给出比我更好的答案,请随时发布。如果它确实更好,我会取消标记你的答案并标记你的答案。


次要更新/错误:

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


最后更新:我放弃

在互联网上搜索 - 并且无端地进行实验 - 我放弃了。

我决定公开该方法,而是使用 命名管道 。现在VBScript脚本只需要写入一个打开到//./pipe/PIPENAME的FSO,让服务找出VBScript想要的内容。

非常感谢你帮助朋友的尝试。

4 个答案:

答案 0 :(得分:1)

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

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

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

实际上,不必为每个api创建不同的.exe(例如,“hms-foo.exe”,“hms-bar.exe”或其他),请将api的名称改为另一个命令行参数。

现在,您可能有一个非常简单的.exe,例如,hmscom.exe,VBScript可以使用命令行调用,例如“hmscom.exe foo SomeAweSomString”。在内部,hmscom.exe将使用参数“SomeAweSomString”来调用导出的API,foo()。

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

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

答案 1 :(得分:0)

是检查WCF这是两种程序之间的通信方式。

答案 2 :(得分:0)

好的,我的表现如下:

  1. 使用<ComClass(), ProgId("ServiceName")>属性

  2. 标记要公开的类
  3. 在项目的属性&gt;中选中“使程序集COM-Visible ”复选框。申请&gt;装配信息

  4. 制作服务安装程序类

  5. 发布

  6. 使用InstallUtil.exe进行部署。 E.g:

    C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe <appname>.exe.deploy
    
  7. 使用regasm发布COM接口。 E.g:

    C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\regasm <appname>.exe.deploy /codebase <progid>
    
  8. 完成!

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

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

    呼!如此多的箍要跳过: - /


    更新:失败

    经过一些测试......我发现CreateObject-ed实例与当前正在运行的服务叹息相同。

    我会做更多的实验。

答案 3 :(得分:0)

这就是我要做的完全相同的事情-是的,是hMailServer的帮助应用程序,用于筛选电子邮件的收件人,并在不允许任何收件人的情况下拒绝邮件。我有一个vbscript做同样的事情,但是大约有1%的邮件未送达,因为vbscript出错并显示“找不到DSN”-DSN是具有规则的数据库的链接。由于无法解决此问题,因此想到了可以从hmail的OnAcceptMessage事件调用的助手应用程序。我将发件人ID和收件人传递到我的应用程序,并得到一条正确或不正确的消息并附带说明。

我这样做的方法是创建一个侦听预定义端口的TCP服务器应用程序。创建了一个winsock对象,以便与通过发送者/接收者的vbscript中的服务器进行对话。由于服务器是持久性服务器,因此无需重复调用exe或打开/关闭数据库连接。

这里有一些很好的资源可以做到这一点: http://www.vbforums.com/showthread.php?453366-How-to-send-a-simple-string-via-TCP

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

我希望我能得到作者的答复,毕竟距问题发布仅7年零9个月了:)