Das funktioniert im Prinzip so:
Code: Alles auswählen
....
h:= FindWindow(nil, 'receiver');
if h<>0 then
begin
PostMessage(h, WM_USER+10, 0, wdata);
end
else
....
Oder geht das garnicht mit Konsolenanwendungen ?
Code: Alles auswählen
....
h:= FindWindow(nil, 'receiver');
if h<>0 then
begin
PostMessage(h, WM_USER+10, 0, wdata);
end
else
....
Das ist kein guter weg. Das interagieren mit konsolen anwendungen ist viel einfacher als mit Formanwendungen, und gleichzeitig crossplattform kompatibel, da die interaktion unter Posix und Windows fast gleich ist.malabarista hat geschrieben:OK, dankeschön.
Dann hat sich das erledigt und "receiver" als normales Windows-Programm geschrieben.
Code: Alles auswählen
mkfifo MyApp.fifo
tail -n +1 -f MyApp.fifo | MyApp --args
Ja auch Konsolenanwendungen können die unter windows haben, allerdings nur dann wenn du die nachbaust, dich bei Windows Funktionen auch richtig anmeldest. Da geht es aber tief in die Eingeweide von Windows und Lazarus kann dich da nicht mit den Komfortfunktionen unterstützen. Das ist dann dasselbe wie bei C.Warf hat geschrieben:Außerdem bin ich mir da nicht sicher das Konsolen anwendungen keine Message queue haben, ...
Code: Alles auswählen
AProcess := TProcess.Create(nil);
AProcess.Executable := 'MeinProgramm.exe';
AProcess.Options := AProcess.Options + [poUsePipes]; // verwende pipe streams
AProcess.Execute;
...
var SomeData: Integer;
...
AProcess.Input.Write(SomeString, SizeOf(SomeData); // Efentuell noch abfangen ob genug geschrieben wurde, stichwort max pipe size
...
AProcess.Free; //Aufräumen, eventuell vorher terminate?
Code: Alles auswählen
program MyProgramm;
...
var InpStream: THandleStream;
begin
InpStream := THandleStream.Create(StdInputHandle);
try
InpString.Read(SomeData, SizeOf(SomeData)); // Efentuell noch abfangen ob genug gelesen werden konnte
DosomethingWith(SomeData);
finally
InpStream.Free;
end;
end.
IPCclient und server beim fpc verwenden intern glaube ich named pipes, eigent sich vor allem dann sehr gut wenn du keinen zugang zum STDIN/OUT des anderen prozesses hast (z.B. wenn nicht klar ist wann welcher prozess gestartet wird, bzw von wem). Da sie intern ähnlich funktionieren sollte sich es nicht viel geben was von beidem verwendetwp_xyz hat geschrieben:Du könntest auch den IPCServer und IPCClient verwenden, beide sind als Komponenten auf der Palette System aber auch in der Konsole verwendbar. Im Ordner packages/fcl-process/examples gibt die Beispiel-Programme "ipcserver" und "ipcclient": zuerst den Server starten, dann den Client, der eine Nachricht an den Server schickt, bzw mit dem nachricht-Text --stop den Server beendet. Außerdem gibt es noch die Demos "simpleipcserver"/"checkipcclient", sowie bei fpc-trunk noch "threadedipc".