3

あるプロセスから別のプロセスにデータを送信する必要があります。制約 :

送信側プロセスは非常に高価な呼び出しです。vbscipt を使用して行う必要があります。Sender プロセスの場合、このデータ転送は追加作業であり、この機能の影響をあまり受けないはずです。送信側プロセスには、4 ~ 5 分で約 1000 のスレッドがあります。

より高速な IPC が重要です。非同期で実行できる場合は、そのほうがよいでしょう。名前付きパイプについて読みました.vbscriptを使用して名前付きパイプを開くことは可能ですか.また、上記の制約を考慮して他の方法はありますか.

4

2 に答える 2

4

名前付きパイプを使用することは、おそらくネイティブ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
于 2012-06-08T05:37:10.140 に答える
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
于 2013-03-13T02:20:41.293 に答える