我需要將數據從一個進程發送到另一個進程。 限制條件:使用vbscript的進程間通信
發送方的過程非常昂貴的呼叫。 它需要使用vbscipt來完成。 對於發件人進程,這種數據傳輸是一項額外的工作。它不應該受到這個功能的太大影響。 4-5分鐘內,發件人進程中大約有1000個線程。
更快的IPC很重要。如果它可以做到異步,它會更好。 我讀了關於命名pipe.Is有可能打開一個命名管道使用VBScript。也有任何其他可能的方式考慮上述約束。
我需要將數據從一個進程發送到另一個進程。 限制條件:使用vbscript的進程間通信
發送方的過程非常昂貴的呼叫。 它需要使用vbscipt來完成。 對於發件人進程,這種數據傳輸是一項額外的工作。它不應該受到這個功能的太大影響。 4-5分鐘內,發件人進程中大約有1000個線程。
更快的IPC很重要。如果它可以做到異步,它會更好。 我讀了關於命名pipe.Is有可能打開一個命名管道使用VBScript。也有任何其他可能的方式考慮上述約束。
使用命名管道可能是您本地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
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'作爲參數傳遞給回調函數,如下所示:'調用oCallback(「Success!」)'。 「價值」道具的實現起作用,但對於儘可能簡單的IPC似乎沒有必要。 – wqw
是否有通過VB scripts.IF可能使用命名管道的任何缺點,你能告訴我任何網站,我可以找到更多的信息關於這個實現?正如我所告訴的,將有許多線程寫入命名管道。對於閱讀,只有一個線程。 – user1443731
唯一的缺點是隻能在命名管道上寫入文本 - 不是二進制數據。沒有人通過VBScript來完成IPC,所以你可以做的最好的事情是在命名管道上閱讀 - http://msdn.microsoft.com/en-us/library/windows/desktop/aa365590%28v=vs.85%29.aspx – shf301