3 votes

Communication interprocessus à l'aide de vbscript

J'ai besoin d'envoyer des données d'un processus à un autre. Contraintes :

Le processus d'envoi est un appel très coûteux. Il doit être fait en utilisant vbscipt. Pour le processus expéditeur, ce transfert de données est un travail supplémentaire qui ne devrait pas être affecté par cette fonctionnalité. Il y a environ 1000 threads dans un processus expéditeur en 4-5 minutes.

La rapidité de l'IPC est importante et si elle peut être réalisée de manière asynchrone, ce sera mieux. J'ai lu des informations sur le named pipe, est-il possible d'ouvrir un named pipe en utilisant vbscript, et y a-t-il d'autres moyens possibles compte tenu des contraintes ci-dessus ?

4voto

shf301 Points 19188

L'utilisation d'un tube nommé est probablement votre seule option à partir du VBScript natif. Vous pouvez accéder à toutes les autres méthodes IPC en écrivant un objet COM dans un autre langage.

Un pipe nommé peut être écrit de la même manière qu'un fichier, vous pouvez donc utiliser la fonction FileSystemObject pour ouvrir et lire/écrire depuis un tube nommé. Le format pour ouvrir un tube nommé est le suivant \\\\.\pipe\PipeName (Remplacer PipeName par le nom réel du tuyau).

Donc pour écrire dans un tube nommé en VBScript :

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

2voto

Vozzie Points 21
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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X