2012-06-08 3 views
3

Мне нужно отправить данные из одного процесса в другой. Ограничения:Inter Process Communication с использованием vbscript

Процесс отправления - очень дорогой звонок. Это нужно сделать с помощью vbscipt. Для процесса Отправителя эта передача данных является дополнительной работой. Она не должна сильно зависеть от этой функции. Примерно 1000 потоков в процессе отправителя через 4-5 минут.

Быстрое IPC важно. Если это можно сделать асинхронно, это будет лучше. Я читал об именованном канале. Можно открыть именованный канал, используя vbscript. Также есть ли другой возможный способ с учетом вышеуказанных ограничений.

ответ

4

Использование именованного канала, вероятно, является вашим единственным вариантом из собственного VBScript. Вы можете получить доступ к любому из других методов IPC, написав COM-объект на каком-то другом языке.

Именованный канал можно записать так же, как файл, чтобы вы могли использовать FileSystemObject для открытия и чтения/записи из именованного канала. Формат открытия именованного канала - использовать формат \\\\.\pipe\PipeName (Заменить имя_трубки фактическим именем трубы).

Так писать в именованный канал в VBScript:

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

Есть ли недостаток в использовании именованных каналов через VB scripts.IF возможно, вы можете сказать мне любой веб-сайт, где я могу найти больше информации об этой реализации? Как я уже сказал, будет много потоков для записи в именованный канал. Для чтения есть только один поток. – user1443731

+0

Единственным недостатком является то, что на именованный канал можно писать только текстовые, а не двоичные данные. Никто не делает IPC через VBScript, поэтому лучше всего вы можете читать по именованным каналам - http://msdn.microsoft.com/en-us/library/windows/desktop/aa365590%28v=vs.85%29.aspx – shf301

1
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 
+0

Некоторый серьезный внепроцессный COM-маршаллинг продолжается за кулисами! Btw, вы можете передать 'oData.Value' в качестве параметра для обратного вызова следующим образом:' Call oCallback («Успех!») '. Истина поддержки «Value» работает, но кажется излишней для максимально простого IPC. – wqw

Смежные вопросы