Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Handle von Konsolen-App? (https://www.delphipraxis.net/211320-handle-von-konsolen-app.html)

charly52 29. Aug 2022 18:19

Handle von Konsolen-App?
 
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

himitsu 29. Aug 2022 18:39

AW: Handle von Konsolen-App?
 
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

Phoenix 30. Aug 2022 06:54

AW: Handle von Konsolen-App?
 
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.

charly52 30. Aug 2022 09:52

AW: Handle von Konsolen-App?
 
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

himitsu 30. Aug 2022 10:08

AW: Handle von Konsolen-App?
 
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.

charly52 30. Aug 2022 15:13

AW: Handle von Konsolen-App?
 
Oh Je Oh Je

Zitat:

Zitat von himitsu (Beitrag 1511004)
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??


Zitat:

Zitat von himitsu (Beitrag 1511004)
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

himitsu 30. Aug 2022 15:48

AW: Handle von Konsolen-App?
 
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

Delphi.Narium 30. Aug 2022 16:20

AW: Handle von Konsolen-App?
 
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.)

charly52 31. Aug 2022 07:23

AW: Handle von Konsolen-App?
 
Das ist ja ein ganzer Sack an Info.
Da muss ich mich jetzt erst mal reinfinden

Aber VIELEN Dank an alle

Charly

charly52 2. Sep 2022 15:04

AW: Handle von Konsolen-App?
 
Zitat:

Zitat von himitsu (Beitrag 1511023)
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
Delphi-Quellcode:
  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


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:18 Uhr.
Seite 1 von 3  1 23      

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