Hi!
Ich habe mir (da ich oft mit Multi-Instanzen von AutoIt Programmen arbeite) eine kleine DLL geschrieben, welche die Kommunikation zwischen den Prozessen so einfach wie möglich macht. Die DLL nutzt die Windowseigene Mailslot-Pipeline und enthält sonst nichts, bis auf viele Error-Handlings.
Das einzige was ihr zur Inbetriebnahme braucht ist die DLL, die ihr per "regsvr32" im System registrieren müsst. Ihr könnt sie jederzeit wieder entfernen (Parameter /u). Einige Virenscanner mögen vielleicht anschlagen, weil die DLL mit mpress komprimiert wurde.
Die DLL wird objektorientiert angesprochen und bietet genau 4 Befehle, die alle in diesem Beispiel enthalten sind. In diesem Test-Skript kommuniziert der Prozess mit sich selbst. . Push und Pop mögen den Eindruck eines Stacks machen, sind aber willkürlich gewählte Namen. Die Daten können wie und wann man will gesendet werden.
[autoit]Opt("GUIOnEventMode", 1)
[/autoit][autoit][/autoit][autoit]$oShare = ObjCreate("Pipeline.Pipe")
ConsoleWrite("!> " & @error & @LF)
$oShare.CreateSlot ; Erstellt einen Slot, der für die aktuelle PID alle Anfragen abhört
[/autoit][autoit][/autoit][autoit]GUICreate("Test", 200, 55)
GUISetOnEvent(-3, "quit")
$hInput = GUICtrlCreateInput("Data to send...", 5, 5, 190, 21)
$hSend = GUICtrlCreateButton("Send", 5, 31, 190, 20)
GUICtrlSetOnEvent(-1, "_send")
GUISetState()
While Sleep(10)
$Data = $oShare.Pop ; Empfängt alle Daten, die an diesen Prozess übergeben werden
If $Data <> "" Then ConsoleWrite("!> Data: " & $Data & @LF)
WEnd
Func _send()
$oShare.Push(GUICtrlRead($hInput), @AutoItPID) ; Sendet Daten. Hier an den selben Prozess zu Testzwecken.
; Für andere Prozesse einfach eine andere PID einsetzen.
EndFunc
Func quit()
$oShare.DestroySlot ; Slot schließen
Exit
EndFunc