Process 利用vbscript实现进程间通信
我需要将数据从一个进程发送到另一个进程。 限制条件: 发送方进程是非常昂贵的呼叫。 这需要使用vbscipt来完成。 对于发送方进程,此数据传输是一项附加工作。它不应受到此功能的太大影响。在4-5分钟内,发送器进程中大约有1000个线程 更快的IPC是很重要的。如果可以异步完成,它会更好。Process 利用vbscript实现进程间通信,process,vbscript,ipc,communication,Process,Vbscript,Ipc,Communication,我需要将数据从一个进程发送到另一个进程。 限制条件: 发送方进程是非常昂贵的呼叫。 这需要使用vbscipt来完成。 对于发送方进程,此数据传输是一项附加工作。它不应受到此功能的太大影响。在4-5分钟内,发送器进程中大约有1000个线程 更快的IPC是很重要的。如果可以异步完成,它会更好。 我读过有关命名管道的内容。是否可以使用vbscript打开命名管道。考虑到上述限制,是否还有其他可能的方法。使用命名管道可能是本机vbscript的唯一选项。您可以通过使用其他语言编写COM对象来访问任何其他
我读过有关命名管道的内容。是否可以使用vbscript打开命名管道。考虑到上述限制,是否还有其他可能的方法。使用命名管道可能是本机vbscript的唯一选项。您可以通过使用其他语言编写COM对象来访问任何其他IPC方法 命名管道可以像文件一样写入,因此可以使用打开命名管道并从中读/写。打开命名管道的格式是使用
\\\\\\.\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脚本使用命名管道有什么缺点吗?如果可能的话,你能告诉我在哪个网站上可以找到关于这个实现的更多信息吗?正如我之前所说,将有许多线程用于写入命名管道。读取只有一个线程。唯一的缺点是,只能在命名管道上写入文本,而不能写入二进制数据。没有人通过VBScript执行IPC,所以您所能做的最好的事情就是读取命名管道-一些严重的进程外COM编组正在幕后进行!顺便说一句,您可以将
oData.Value
作为参数传递给回调函数,如下所示:callocallback(“Success!”)
。Value
prop的impl可以工作,但对于尽可能简单的IPC来说似乎没有必要。
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