使用VBScript进行进程间通信

3
我需要将数据从一个进程发送到另一个进程。
约束条件: - 发送进程是非常昂贵的调用。 - 它需要使用vbscipt来完成。 - 对于发送进程,这种数据传输是额外的工作。它不应该受到此功能的太大影响。在4-5分钟内有大约1000个线程在发送进程中。 - 更快的IPC很重要。如果可以异步地完成,那就更好了。 - 我读过命名管道。是否可能使用vbscript打开命名管道?还有其他可能的方式考虑上述约束条件吗?
2个回答

5

从本地的VBScript来看,使用命名管道可能是您唯一的选择。您可以通过使用其他语言编写COM对象来访问任何其他IPC方法。

命名管道可以像文件一样进行写入,因此您可以使用FileSystemObject打开和读写命名管道。 打开命名管道的格式为\\\\.\pipe\PipeName(将PipeName替换为管道的实际名称)。

因此,要在VBScript中写入命名管道:

Set fs = CreateObject("Scripting.FileSystemObject")
Set a = fs.CreateTextFile("\\.\pipe\PipeName", True)
a.WriteLine("This is a test.")
a.Close

使用VB脚本通过命名管道有什么缺点吗?如果可能的话,您能告诉我哪个网站可以找到更多关于这种实现的信息吗?正如我之前所说,将有许多线程用于写入命名管道。对于读取,只有一个线程。 - user1443731
唯一的缺点是只能在命名管道上写文本,而不能写二进制数据。没有人会通过VBScript进行IPC,所以你最好阅读有关命名管道的资料 - http://msdn.microsoft.com/en-us/library/windows/desktop/aa365590%28v=vs.85%29.aspx - shf301

2
Option Explicit

Dim g_receivedCallback

If WScript.Arguments.Named.Exists("NEW") Then
    RunSecondInstance
Else
    RunFirstInstance
End If

Sub RunSecondInstance()
    Dim oSa, oWindow, oData, oCallback
    ' Search for the window
    Set oSa = CreateObject("Shell.Application")
    For Each oWindow In oSa.Windows
        If TypeName(oWindow.Document) = "HTMLDocument" Then
            If InStr(oWindow.Document.Title, "IPC Window") > 0 Then
                ' Get the data object, set a property and callback a method
                Set oData = oWindow.GetProperty ("IPCData") 
                Set oCallback = oData.Callback
                oData.Value = "Success!"
                Call oCallback
            End If
        End If
    Next
End Sub

Sub RunFirstInstance()

    Dim oData, oIe, oWs

    ' Create a object to pass to a other script
    Set oData = New IPCData
    ' Set a property to a callback method
    Set oData.Callback = GetRef("MyCallback")

    ' Create a window and store the data in the window
    Set oIe = CreateObject("InternetExplorer.Application")
    oIe.Navigate "about:blank"
    Do Until oIe.ReadyState = 4 : WScript.Sleep 5 : Loop
    oIe.Document.Title = "IPC Window"
    oIe.PutProperty "IPCData", oData

    ' Run second script instance
    Set oWs = CreateObject("WScript.Shell")
    oWs.Run "WSCRIPT.EXE """ & WScript.ScriptFullName & """ /NEW"

    ' Wait for callback from second script
    Do  Until g_receivedCallback = True : WScript.Sleep 5 : Loop

    ' Display received data
    MsgBox oData.Value

    ' Close ie
    oIe.Quit

End Sub

Sub MyCallback()
    g_receivedCallback = True
End Sub

Class IPCData

    Private m_callback
    Public Property Get Callback()
        Set Callback = m_callback
    End Property
    Public Property Set Callback(ByVal v)
        Set m_callback = v
    End Property

    Private m_value
    Public Property Get Value()
        If IsObject(m_value) Then
            Set Value = m_value
        Else
            Value = m_value
        End If
    End Property
    Public Property Let Value(ByVal v)
        m_value = v
    End Property
    Public Property Set Value(ByVal v)
        Set m_value = v
    End Property

End Class

幕后进行了一些严重的进程外COM封送!顺便说一下,您可以像这样将oData.Value作为参数传递给回调函数:Call oCallback("Success!")Value属性的实现是有效的,但对于尽可能简单的IPC似乎是不必要的。 - wqw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接