Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Konsole oder keine Konsole? (https://www.delphipraxis.net/148626-konsole-oder-keine-konsole.html)

gpvg 5. Mär 2010 08:05


Konsole oder keine Konsole?
 
Ich habe ein kleines Problem mit der Konsole. Mein Programm soll beim Start herausfinden, ob es von der Konsole aus gestartet wurde oder nicht. Wenn es von der Konsole gestartet wurde, dann soll es als Konsolenanwendung starten, wenn es nicht von der Konsole gestartet wurde, dann soll es eine normale VCL-Anwendung sein.
Es geht hierbei wirklich nur um die Eingaben des Benutzers (entweder auf Konsolenebene oder eben auch in ein Fenster). Momentan regle ich dies über 2 EXE-Dateien, der Anwender muß also selbst entscheiden, welche Variante er nimmt.

Also ganz kurz:
Wie kann eine Anwendung erkennen, ob es von der Konsole gestartet wurde? Bis zur Erkennung soll das Programm ohne Konsole und ohne Fenster laufen.
Wenn das Programm nun herausgefunden hat, daß es von der Konsole läuft, wie bekomme ich es hin, daß es jetzt selbst als Konsolenapplikation läuft?

gpvg 5. Mär 2010 08:07

Sorry, sollte eigentlich an anderer Stelle im Forum landen
 
Tja, bei den vielen Fenstern kann man sich schonmal verhaspeln.

jfheins 5. Mär 2010 08:12

Re: Konsole oder keine Konsole?
 
Beides: Gar nicht.

Du bekommst es nicht raus. Als "Hack" kannst du natürlich gucken ob ein cmd fenster offen ist und ob darin gerade eine Anwendung gestartet wurde, aber wer deinen Anwendung gestartet hat, wirst du nicht rausbekommen. Eine Möglichkeit wäre, dass du die Parameter auswertest und wenn z.B. "-cmd" angegeben wurde, sartest du als Konsolenanwendung und sonst mit GUI.
Und zum zweiten ist deine Anwendung bereits eindeutig als Konsolen oder GUi Anwendung gebrandmarkt, bevor du überhaupt die Kontrolle bekommst. Im Header der Exe steht nämlich so n Flag dass das festlegt. Du kannst natürlich eine Konsolenanwendung schreiben, die sich dann selber versteckt und ein Formular öffnet.

Kurzzusammenfassung: Lass es bei den 2 Anwendungen, das ist schon mehr Service als man erwarten kann (Wer liefert heutzutage noch eine Konsolenversion mit?) ;)

Neutral General 5. Mär 2010 08:25

Re: Konsole oder keine Konsole?
 
Hallo,

Bei codeproject.com gibt es eine Möglichkeit. Ist auch nichtmal so schwer zu implementieren:

http://www.codeproject.com/KB/threads/ParentPID.aspx

Gruß
Neutral General

SirThornberry 5. Mär 2010 08:51

Re: Konsole oder keine Konsole?
 
ich würde es wie beim Shutdown-Befehl von Windows handhaben. Wer die Gui sehen will muss einfach einen Parameter mitgeben welcher das GUI anzeigt.

mse1 5. Mär 2010 10:06

Re: Konsole oder keine Konsole?
 
Zitat:

Zitat von gpvg
Wie kann eine Anwendung erkennen, ob es von der Konsole gestartet wurde?

Prüfe ob die getstdhandle() Funktion ein gültiges handle liefert. Wenn ja wurde das Programm von der Konsole oder mit pipes gestartet. MSEgui benützt diese Methode um debug-writeln auch ohne aufrufende Konsole zu ermöglichen:
Delphi-Quellcode:
procedure writestdout(value: string; newline: boolean = false);
 {$ifdef mswindows}
var
 ca1: longword;
 {$endif}
begin
 if newline then begin
  value:= value + lineend;
 end;
 {$ifdef UNIX}
  __write(1,pointer(value)^,length(value));
 {$else}
  if getstdhandle(std_output_handle) <= 0 then begin
   allocconsole;
  end;
  writefile(getstdhandle(std_output_handle),pointer(value)^,length(value),ca1,nil);
 {$endif}
end;
Um festzustellen ob das Programm mit einem Konsolenfenster verbunden ist kann ab win2000 GetConsoleWindow() verwendet werden.
http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx

Martin

Meflin 5. Mär 2010 10:58

Re: Konsole oder keine Konsole?
 
Zitat:

Zitat von jfheins
wer deinen Anwendung gestartet hat, wirst du nicht rausbekommen

Auch wenn es nicht so aussieht, verwaltet Windows intern (wie auch alle Unixe) einen Prozessbaum. Diese Hierarchie wird nur nicht nach außen getragen. Durch ermitteln der passenden inoffiziellen Systemcalls (siehe Neutrals Link) hat man da also durchaus Erfolgsaussichten.

p80286 5. Mär 2010 11:22

Re: Konsole oder keine Konsole?
 
Mal so dazwischen gefragt,

wofür soll das gut sein?
Der Unterschied liegt doch eigentlich "nur" in der Ausgabe, was natürlich auch die Programmsteuerung durch den Benutzer beeinflusst).

Gruß
K-H

Oh man, ich hab den inhalt der Ursprungsfrage nicht richtig gelesen! *schäm*

himitsu 5. Mär 2010 11:53

Re: Konsole oder keine Konsole?
 
Delphi-Quellcode:
if AttachConsole(ATTACH_PARENT_PROCESS) then
  {Console ist vorhanden}
Wenn MSDN-Library durchsuchenAttachConsole erfolgreich war, dann ist ein Consolenfenster vorhanden.

Delphi-Quellcode:
{$APPTYPE CONSOLE}
Die Anwendung darf aber nicht als Konsolenanwendung deklariert sein, sonst erstellt Windows automatisch eine Console, wenn noch keine vorhanden ist. Also am Besten das {$APPTYPE ganz einfach weglassen.


Dieser Code läuft jedenfalls bei mir recht gut.
Delphi-Quellcode:
Var ConsoleCreated, B: Boolean;
  ConsoleHandle: THandle;

B := AttachConsole(ATTACH_PARENT_PROCESS);
{$IFDEF CreateConsole}
  ConsoleCreated := not B;
  If ConsoleCreated Then B := AllocConsole;
{$ELSE}
  ConsoleCreated := False;
{$ENDIF}
If B Then Begin
  ConsoleHandle := GetStdHandle(STD_OUTPUT_HANDLE);
  ...
End Else ConsoleHandle := INVALID_HANDLE_VALUE;

http://www.delphipraxis.net/internal...=attachconsole


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:18 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz