Findwindow für Konsolenanwendung ?

Für Fragen von Einsteigern und Programmieranfängern...

Findwindow für Konsolenanwendung ?

Beitragvon malabarista » 10. Aug 2018, 09:44 Findwindow für Konsolenanwendung ?

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 ?
malabarista
 
Beiträge: 287
Registriert: 11. Jun 2016, 11:16
Wohnort: Konstanz
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0 | 
CPU-Target: 64Bit
Nach oben

Beitragvon af0815 » 10. Aug 2018, 13:00 Re: Findwindow für Konsolenanwendung ?

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).
af0815
 
Beiträge: 3479
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: FPC 3.2 Lazarus 2.0 per fpcupdeluxe | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon mschnell » 10. Aug 2018, 14:04 Re: Findwindow für Konsolenanwendung ?

Deshalb geht auch TTimer nicht.
-Michael
mschnell
 
Beiträge: 3226
Registriert: 11. Sep 2006, 09:24
Wohnort: Krefeld
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ) | 
CPU-Target: X32 / X64 / ARMv5
Nach oben

Beitragvon malabarista » 10. Aug 2018, 14:12 Re: Findwindow für Konsolenanwendung ?

OK, dankeschön.
Dann hat sich das erledigt und "receiver" als normales Windows-Programm geschrieben.
malabarista
 
Beiträge: 287
Registriert: 11. Jun 2016, 11:16
Wohnort: Konstanz
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0 | 
CPU-Target: 64Bit
Nach oben

Beitragvon Warf » 10. Aug 2018, 18:31 Re: Findwindow für Konsolenanwendung ?

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.
Warf
 
Beiträge: 984
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon af0815 » 10. Aug 2018, 20:42 Re: Findwindow für Konsolenanwendung ?

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).
af0815
 
Beiträge: 3479
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: FPC 3.2 Lazarus 2.0 per fpcupdeluxe | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon malabarista » 11. Aug 2018, 14:42 Re: Findwindow für Konsolenanwendung ?

@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.
malabarista
 
Beiträge: 287
Registriert: 11. Jun 2016, 11:16
Wohnort: Konstanz
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0 | 
CPU-Target: 64Bit
Nach oben

Beitragvon Warf » 11. Aug 2018, 20:44 Re: Findwindow für Konsolenanwendung ?

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.
Warf
 
Beiträge: 984
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon wp_xyz » 11. Aug 2018, 23:58 Re: Findwindow für Konsolenanwendung ?

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".
wp_xyz
 
Beiträge: 2640
Registriert: 8. Apr 2011, 08:01

Beitragvon malabarista » 12. Aug 2018, 17:11 Re: Findwindow für Konsolenanwendung ?

Das sind jetzt sehr viele Ideen und Anregungen !
Dankeschön.
malabarista
 
Beiträge: 287
Registriert: 11. Jun 2016, 11:16
Wohnort: Konstanz
OS, Lazarus, FPC: Linux Mint 18.1 L1.6.2-1 FPC 3.0.0 | 
CPU-Target: 64Bit
Nach oben

Beitragvon Warf » 12. Aug 2018, 17:37 Re: Findwindow für Konsolenanwendung ?

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
Warf
 
Beiträge: 984
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

• Themenende •

Zurück zu Einsteigerfragen



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste

porpoises-institution
accuracy-worried