AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Handle von Konsolen-App?

Ein Thema von charly52 · begonnen am 29. Aug 2022 · letzter Beitrag vom 8. Sep 2022
Antwort Antwort
Seite 1 von 3  1 23      
charly52

Registriert seit: 2. Sep 2018
Ort: Salem, Baden
102 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Handle von Konsolen-App?

  Alt 29. Aug 2022, 19:19
Hi all,

gibts ne Möglichkeit sowas wie
Delphi-Quellcode:
  hWindow := FindWindow('notepad', nil);
  SetForegroundWindow(hWindow);
auch für eine Konsolenanwendung zu machen?

Hat die überhaupt ein "Window" ?

Danke Charly
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: Handle von Konsolen-App?

  Alt 29. Aug 2022, 19:39
Diese Anwendung selber hat natürlich kein Window-Handle.
Deine Anwendung läuft in einem ConsoleHost und an ihm kann ein Terminal hängen.

Wenn Sie aber in einer Console-/Terminal-Anwendung läuft angezeigt wird ... diese "Anwendung" hat natürlich ein Handle.

z.B.
cmd.exe > ConsoleWindowClass
Windows-Terminal > CASCADIA_HOSTING_WINDOW_CLASS / Windows.UI.Core.CoreWindow / Windows.UI.Composition.DesktopWindowContentBridge / ...


MSDN-Library durchsuchenGetConsoleWindow
$2B or not $2B

Geändert von himitsu (29. Aug 2022 um 19:43 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.641 Beiträge
 
#3

AW: Handle von Konsolen-App?

  Alt 30. Aug 2022, 07:54
Guten Morgen Charly,

was möchtest Du denn machen?

Mit einer Konsolenanwendung kann man ja klassischerweise nur per stdin / stdout kommunizieren, also im Prinzip nach stdin Tasteneingaben hinschicken und die Ausgabe aus stdout (oder stderr) auslesen.

Wenn Du den Prozess selber steuerst / startest kannst Du Dich freilich an die streams dran hängen und beliebiges reinschreiben und auslesen.

Eine Konsolenanwendung muss aber nicht unbedingt ein Terminal haben. Sie kann z.B. als child-prozess eines anderen Programmes komplett unsichtbar laufen gelassen werden. Da wüsste ich aber ehrlich gesagt keinen Weg, wie man an stdout / stdin eines schon laufenden Prozesses käme.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
charly52

Registriert seit: 2. Sep 2018
Ort: Salem, Baden
102 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Handle von Konsolen-App?

  Alt 30. Aug 2022, 10:52
ich habe folgenden Code in einer KonsolenApp

Delphi-Quellcode:
    selcmd:= 3;
    repeat
      case selcmd of
        1 : tuewas;
        2 : tue was anderes
        3 : .....
        else writeln('wrong command');
      end;

      writeln;
      writeln;
      writeln('Commands');
      writeln('0 : Quit the Kernel');
      writeln('1 : Reset ');
      writeln('2 : Calc');

      writeln('Enter command:');
      readln(selcmd);
    until (selcmd=0);
Und diese Kommandos "0,1,2,3,..." möchte ich von einem anderen Programm (einem Rest-Server) aus zur Konsolenanwendung schicken.
Die KonsolenApp läuft in einem "CMD-Fenster"??? z.B. nach einem Start mittels Konsolenanwendung.exe doppelklick
bis sie "0" bekommt.

Charly
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

AW: Handle von Konsolen-App?

  Alt 30. Aug 2022, 11:08
Die Löstung ist hier "notmalerweise" immer, dass man die Consolenanwendung startet und ihr ein anderes STDIN mitgibt, also einen Stream (Pipe), über Welchen man was dort rein gibt.
Und will man auf Ausgaben reagieren, dann auch noch STDOUT/STDERR auf eine Pipe umleiten, welche man dann ausliest.

Wie z.B. das | (Piepe) bzw. > und < in der CMD.

MSDN-Library durchsuchenCreateProcess > STARTUPINFO.hStdInput




Klar, eventuell kann man auch das Fenster suchen und Tastendrücke simulieren, aber der Spaß beginnt schon damit, dass es viele Terminal-Programme gibt (nicht mehr nur die CMD.exe) und Jeder anders reagiert.
z.B. das neue Windows Terminal verarbeitet Tastatur/Maus über DirectX. (wenn ich mich nicht irre)
Aber sowas macht man nicht, da es zu unsicher ist.



Wenn beide Seiten von dir kommen, dann wäre es kein Problem einen anderen Weg zu gehen, also z.B. eine "globale" NamedPipe auf die dein zusätzlich Programm lauscht und an Welche das andere Programm etwas sendet.

Oder ein unsichtbares MessageOnly-Fenster generieren (so ähnlich wie das Application im Delphi), irgendwie dessen Handle rausgeben oder abrufen oder ihm einen bekannten Namen zu geben und dann via SendMessage etwas empfangen (WM_SETTEXT, WM_COPY oder sonstwas).

Oder ansonsten jegliche andere IPC-Lösung, inkl. DDE, ActiveX und Sonstwas.
$2B or not $2B

Geändert von himitsu (30. Aug 2022 um 11:18 Uhr)
  Mit Zitat antworten Zitat
charly52

Registriert seit: 2. Sep 2018
Ort: Salem, Baden
102 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Handle von Konsolen-App?

  Alt 30. Aug 2022, 16:13
Oh Je Oh Je

Die Löstung ist hier "notmalerweise" immer, dass man die Consolenanwendung startet und ihr ein anderes STDIN mitgibt, also einen Stream (Pipe), über Welchen man was dort rein gibt.
Und will man auf Ausgaben reagieren, dann auch noch STDOUT/STDERR auf eine Pipe umleiten, welche man dann ausliest.

Wie z.B. das | (Piepe) bzw. > und < in der CMD.

MSDN-Library durchsuchenCreateProcess > STARTUPINFO.hStdInput
Sorry, steh hier total auf dem Schlauch.
Ich kenne "prog1 | prog2" oder die Variante ne datei als Input "prog1 < file" oder so ähnlich auf der CMD Ebene.
Aber wie muss ich die Zeile verstehen. Ist das Code in meiner KonsolenApp??


Wenn beide Seiten von dir kommen, dann wäre es kein Problem einen anderen Weg zu gehen, also z.B. eine "globale" NamedPipe auf die dein zusätzlich Programm lauscht und an Welche das andere Programm etwas sendet.
Das ist der Fall, gibts nen Link zu einem Beispiel für Dummies?
Wäre toll, da ich auch damit bisher nichts am Hut hatte

Danke Charly
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

AW: Handle von Konsolen-App?

  Alt 30. Aug 2022, 16:48
Hier im Forum suchenIPC
Bei Google suchendelphi IPC
Bei Google suchendelphi Inter-process communication

Hier im Forum suchenCreateProcess hStdInput
Hier im Forum suchenCreateProcess hStdOutput
Bei Google suchenDelphi CreateProcess hStdInput

Aus den ersten Suchergebnissen...
https://www.delphipraxis.net/189156-...owershell.html
https://www.delphipraxis.net/117567-...ung-nicht.html
Zeigt zumindestens schonmal ansatzweise, wie das aussieht
* Pipes erstellen
* * mindestens hStdInput, wo du deine Befehle rein schreiben kannst
* * und eventuell auch noch hStdOutput, wo die Antwort zurück kommt
* dann damit den Prozess starten
* auf dessen Ende warten
* und währenddessen die Ein-/Ausgaben behandeln, also in StdIn reinschreiben und aus StdOut lesen (ja, andersrum, da aus Sicht des gestarteten Programms)


Sonst hab ich jetzt nichts Fertiges anzubieten,
aber z.B. bezüglich Hier im Forum suchenExecAndWait und Co., ala Programm starten und Ausgaben lesen, gibt es hier mehrere Beispiele.
https://www.delphipraxis.net/152426-...-umleiten.html
https://www.delphipraxis.net/164364-...-einlesen.html

https://getitnow.embarcadero.com/?q=...&categories=-1
$2B or not $2B
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#8

AW: Handle von Konsolen-App?

  Alt 30. Aug 2022, 17:20
Was Du haben willst, ist ein klassisches CGI-Programm.

Mein olles Delphi7 bietet das unter

Datei
Neu
weitere
Web-Server-Anwendung

und dort dann CGI-Einzelanwendung

an.

Damit hast Du schonmal alles, was eine entsprechende Konsolenanwendung benötigt.

Die weitere Programmierung ist identisch mit der einer ISAPI.dll.

Und die war ja hier Daten lesen und schreiben aus einer ISAPI-Dll schonmal Thema. Damit sollte es für Dich da eine sehr geringe Lernkurve geben.

Bei Delphi 7 ist dashier ein Grundgerüst für ein CGI-Programm:
Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

uses
  WebBroker,
  CGIApp,
  Unit1 in 'Unit1.pas{WebModule1: TWebModule};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TWebModule1, WebModule1);
  Application.Run;
end.
und dashier eine ISAPI.dll:
Delphi-Quellcode:
library Project2;

uses
  ActiveX,
  ComObj,
  WebBroker,
  ISAPIThreadPool,
  ISAPIApp,
  Unit1 in 'Unit1.pas{WebModule1: TWebModule};

{$R *.res}

exports
  GetExtensionVersion,
  HttpExtensionProc,
  TerminateExtension;

begin
  CoInitFlags := COINIT_MULTITHREADED;
  Application.Initialize;
  Application.CreateForm(TWebModule1, WebModule1);
  Application.Run;
end.
Und wenn man das TWebModule1 in beides einbindet, kann man sehr einfach aus einem Webmodul sowohl eine ISAPI.dll als auch ein CGI-Programm machen und umgekehrt (derweil: Sie sind absolut kompatibel).

Achso: Man kann ein Konsolenprogramm auch per Pipe "bedienen", muss man bei CGI-Programmen aber nicht, das bekommt man hier geschenkt. (Zumindest war es bei Delphi 7 so, ob's aktuell auch noch so ist, müsstest Du mal überprüfen, kann mir aber nicht vorstellen, dass es hier jetzt auf einmal große Unterschiede geben könnte.)
  Mit Zitat antworten Zitat
charly52

Registriert seit: 2. Sep 2018
Ort: Salem, Baden
102 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

AW: Handle von Konsolen-App?

  Alt 31. Aug 2022, 08:23
Das ist ja ein ganzer Sack an Info.
Da muss ich mich jetzt erst mal reinfinden

Aber VIELEN Dank an alle

Charly
  Mit Zitat antworten Zitat
charly52

Registriert seit: 2. Sep 2018
Ort: Salem, Baden
102 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

AW: Handle von Konsolen-App?

  Alt 2. Sep 2022, 16:04
Aus den ersten Suchergebnissen...
https://www.delphipraxis.net/117567-...ung-nicht.html
Zeigt zumindestens schonmal ansatzweise, wie das aussieht
* Pipes erstellen
* * mindestens hStdInput, wo du deine Befehle rein schreiben kannst
* * und eventuell auch noch hStdOutput, wo die Antwort zurück kommt
* dann damit den Prozess starten
* auf dessen Ende warten
* und währenddessen die Ein-/Ausgaben behandeln, also in StdIn reinschreiben und aus StdOut lesen (ja, andersrum, da aus Sicht des gestarteten Programms)
hi himitsu,

danke, das hat schon richtig geholfen.
Kann jetzt meine KonsolenApp starten.
Habe dann im Code von little_budda an der Stelle

//jetzt mit ReadFile/WriteFile kommunizieren

folgendes eingeführt:

Delphi-Quellcode:
  
var
    chBuf : Array[1..2] of Char;
    written : longWord;

begin
  .........
//jetzt mit ReadFile/WriteFile kommunizieren
    while true do
      begin
        chbuf[1]:= '3';
        chbuf[2]:= #13;

        bSuccess:= WriteFile(WriteInput{g_hChildStd_IN_Wr}, chBuf, 2{dwRead}, Written{&dwWritten}, nil);

        if (NOT bSuccess) then
        begin
          err:= GetLastError;
          break;
        end;
      end;
Und jetzt was zum Verständnis.
Wenn ich in der STARTUPINFO Struktur einen "Input-Handle" für die KonsolenApp erzeuge
  CreatePipe(StartStruct.hStdInput, WriteInput, @SecAttr, 0); //die Handles erzeugen sollte ich mit WriteFile doch direkt da reinschreiben könen? Oder nicht?

Oder muss ich in der KonsolenApp auch noch explizit aus dem neuen Handle lesen?
Ich dachte eigentlich, das beim Starten der KonsolenApp deren StdInput schon umgebogen wird?????

Ihr seht, mir fehlt da ganz Grundsätzliches

Danke für weitere Hilfe


Charly
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz