Findwindow für Konsolenanwendung ?

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
malabarista
Beiträge: 321
Registriert: Sa 11. Jun 2016, 12:16
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0
CPU-Target: 64Bit
Wohnort: Konstanz

Findwindow für Konsolenanwendung ?

Beitrag von malabarista »

Ich möchte von meinem Programm "p2" unter Windows einem anderen Programm "receiver" einen Wert übermitteln.
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
....
 


Wenn "receiver" jetzt eine Konsolenanwendung ist, was kann ich dann statt "FindWindow" verwenden ?
Oder geht das garnicht mit Konsolenanwendungen ?

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Findwindow für Konsolenanwendung ?

Beitrag von af0815 »

Meines Wissens hat eine Konsolenanwendung normalerweise keine Messageqeuce und kann somit keine Botschaften empfangen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Findwindow für Konsolenanwendung ?

Beitrag von mschnell »

Deshalb geht auch TTimer nicht.
-Michael

malabarista
Beiträge: 321
Registriert: Sa 11. Jun 2016, 12:16
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0
CPU-Target: 64Bit
Wohnort: Konstanz

Re: Findwindow für Konsolenanwendung ?

Beitrag von malabarista »

OK, dankeschön.
Dann hat sich das erledigt und "receiver" als normales Windows-Programm geschrieben.

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Findwindow für Konsolenanwendung ?

Beitrag von Warf »

malabarista hat geschrieben:OK, dankeschön.
Dann hat sich das erledigt und "receiver" als normales Windows-Programm geschrieben.


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.

Wenn dein Programm nur von einem anderen programm gesteuert werden soll schreibst du einfach in den In/Out stream. Dafür gibt es die TProcess und TAsyncProcess klasse, die implementieren das. Wenn viele programme mit der Konsolen anwendung interagieren sollen pipest du einfach eine named fifo in den stdin und schreibst dann über diese Fifo. Du musst du eventuell noch die EOF's aus dem fifo filtern (z.b. einfach durch ein tail -f pipen)

Einfaches Unix beispiel:

Code: Alles auswählen

mkfifo MyApp.fifo
tail -n +1 -f MyApp.fifo | MyApp --args

(bash code, lässt sich auch direkt in laz umsetzen, ist aber komplizierzter)
Von jetzt an können beliebige programme sachen in die MyApp.fifo datei schreiben, und egal welches programm darein schreibt, für MyApp verhält es sich genauso als würden diese daten direkt in die Kommandozeile geschrieben werden.
Funktioniert Unter Unix, für Windows gibt es auch bash und coreutils, müsste aber auch alles direkt durch die WinAPI gehen (wenn du die software verteilen willst ist es nicht die beste idee Bash unter Windows vorrauszusetzen). Ansonsten sollte die powershell (und eventuell auch cmd) das auch können, allerdings kenn ich da die programmnamen nicht auswendig

Das ist einfacher, schöner und wahrscheinlich auch effizienter als FindWindow und konsorten

PS: Ansonsten kannst du mit fremden programmen auch über Shared Memory (kompliziert) oder named pipes (die nicht an stdin/stdout gepiped sind) kommunizieren. Außerdem bin ich mir da nicht sicher das Konsolen anwendungen keine Message queue haben, denn z.B. klicks werden als messages gequeued (da keine ansi escape squences unterstützt wurden bis vor kurzem). Und windows bietet auch sonst keine queuing IPC möglichkeiten, daher denke ich das die message queue von jedem prozess verwendet werden kann.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Findwindow für Konsolenanwendung ?

Beitrag von af0815 »

Warf hat geschrieben:Außerdem bin ich mir da nicht sicher das Konsolen anwendungen keine Message queue haben, ...

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.

Ich glaub das letzte mal unter TP sowas gemacht zu haben, wenn mich mein Langzeitgedächtnis nicht im Stich lässt.

Edit:
Über RegisterClassEx kann man in der WndClassEs Struktur einen Pointer auf seine Messagequece mitgeben. Damit hat man sich an das Botschaftssystem angeschlossen
https://msdn.microsoft.com/en-us/librar ... 87(v=vs.85).aspx

Es steht im Buch Delphi 3 Lösungen von Andreas Kosch ab Seite 162 bis 165 einiges davon erklärt. Vor allen, wie man ein Fenster und die Messageverwaltung zu Fuß nachbaut.

Edit2: Da ist auch etwas info darüber versteckt wie es ohne VCL (und LCL) geht.
https://www.delphipraxis.net/568130-post6.html
https://assarbad.net/stuff/tutorials/nonvcl/index.html
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

malabarista
Beiträge: 321
Registriert: Sa 11. Jun 2016, 12:16
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0
CPU-Target: 64Bit
Wohnort: Konstanz

Re: Findwindow für Konsolenanwendung ?

Beitrag von malabarista »

@warf:
es geht nur um die beiden Programme, die miteinander kommunizieren. Eines liest Daten aus (die unregelmässig kommen) und schiebt sie an das andere weiter.

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Findwindow für Konsolenanwendung ?

Beitrag von Warf »

Dann kannst du Pipes verwenden. Konsolenanwendungen kaben ja einen STDIN (Konsolen input) und STDOUT (konsolen output) STDIN enthält alles was der User im terminal eintippt und STDOUT ist das was die Konsole ausgibt. Mit der TProcess klasse kannst du nun ein Programm starten, aber statt STDIN und STDOUT an ein Terminal für einen User zu hängen, bekommst du zwei Streams, in die du von dem aufrufendem Programm schreiben/lesen kannst. Z.B:

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?

Das aufrufende programm z.B.

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.


Kannst natürlich auch Strings versenden und dann ganz normal ReadLn oder WriteLn verwenden.

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Findwindow für Konsolenanwendung ?

Beitrag von wp_xyz »

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".

malabarista
Beiträge: 321
Registriert: Sa 11. Jun 2016, 12:16
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0
CPU-Target: 64Bit
Wohnort: Konstanz

Re: Findwindow für Konsolenanwendung ?

Beitrag von malabarista »

Das sind jetzt sehr viele Ideen und Anregungen !
Dankeschön.

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Findwindow für Konsolenanwendung ?

Beitrag von Warf »

wp_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".


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 verwendet

Antworten