AGB  ·  Datenschutz  ·  Impressum  







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

Konsole oder keine Konsole?

Ein Thema von gpvg · begonnen am 5. Mär 2010 · letzter Beitrag vom 5. Mär 2010
Antwort Antwort
gpvg

Registriert seit: 22. Mär 2007
Ort: Erfurt
18 Beiträge
 
Turbo Delphi für Win32
 
#1

Konsole oder keine Konsole?

  Alt 5. Mär 2010, 09:05
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?
  Mit Zitat antworten Zitat
gpvg

Registriert seit: 22. Mär 2007
Ort: Erfurt
18 Beiträge
 
Turbo Delphi für Win32
 
#2

Sorry, sollte eigentlich an anderer Stelle im Forum landen

  Alt 5. Mär 2010, 09:07
Tja, bei den vielen Fenstern kann man sich schonmal verhaspeln.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#3

Re: Konsole oder keine Konsole?

  Alt 5. Mär 2010, 09:12
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?)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

Re: Konsole oder keine Konsole?

  Alt 5. Mär 2010, 09:25
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
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Konsole oder keine Konsole?

  Alt 5. Mär 2010, 09:51
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
mse1

Registriert seit: 21. Nov 2007
115 Beiträge
 
#6

Re: Konsole oder keine Konsole?

  Alt 5. Mär 2010, 11:06
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
Martin Schreiber
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#7

Re: Konsole oder keine Konsole?

  Alt 5. Mär 2010, 11:58
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.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#8

Re: Konsole oder keine Konsole?

  Alt 5. Mär 2010, 12:22
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*
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Konsole oder keine Konsole?

  Alt 5. Mär 2010, 12:53
Delphi-Quellcode:
if AttachConsole(ATTACH_PARENT_PROCESS) then
  {Console ist vorhanden}
Wenn MSDN-Library durchsuchenAttachConsole erfolgreich war, dann ist ein Consolenfenster vorhanden.

{$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
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort


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 11:57 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