AGB  ·  Datenschutz  ·  Impressum  







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

Konsolenfenster im GUI-Mode unterdrücken

Ein Thema von naujo · begonnen am 23. Aug 2005 · letzter Beitrag vom 19. Apr 2014
Antwort Antwort
Seite 2 von 3     12 3      
10. Nov 2007, 10:24
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Object-Pascal / Delphi-Language" verschoben.
Delphi-Frage.
Benutzerbild von himitsu
himitsu

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

Re: Konsolenfenster im GUI-Mode unterdrücken

  Alt 15. Nov 2007, 12:49
http://fnse.de/S02/15S.gif
ja also, wie gesagt, ich hab 'ne GUI-Anwendung und möchte, falls diese von einer Konsole/Batchfile aus aufgerufen wird, in dieser einen Statustext ausgeben.
$2B or not $2B
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#13

Re: Konsolenfenster im GUI-Mode unterdrücken

  Alt 15. Nov 2007, 13:39
Zitat von himitsu:
dieses hat mir auch gleich mal eine Lösug gegeben, wie ich automatisch rausbekommen kann ob GUI oder Konsole.
Ich verweise mal spontan auf meinen Beitrag der hier unter #10 abgespeichert ist. Den wirst du wohl uebersehen haben.

Warum gibst du deinen Statustext nicht einfach vor dem FreeConsole aus? Ab Vista (oder war's W2K3?) gibt es eine API um die Handles der Elternkonsole zu ermitteln. Mit viel Frickelei kann man die API fuer die vorigen Systeme nachbauen.

Aber um es nochmal zu wiederholen: die Konsole wird nicht vom Konsolenprogramm erzeugt, folglich kann das Konsolenprogramm auch nicht die Erstellung der Konsole verhindern. War das jetzt klar genug?
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#14

Re: Konsolenfenster im GUI-Mode unterdrücken

  Alt 15. Nov 2007, 13:47
Es gibt auf Sourceforge.NET das Projekt Console2. Dieses injiziert in Kindprozesse eine DLL, die unter anderem das Konsolenfenster unterdrückt und ausliest. Das, was in dieser DLL passiert, müsstest du ja auch in deinem eigenen Programm machen können, und dabei müsstest du auch herausfinden können, ob nun eine Konsole da ist oder nicht. Vielleicht ist das interessant für dich, schau mal in den (leider nur mittelmäßig kommentierten) Quellcode.
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Konsolenfenster im GUI-Mode unterdrücken

  Alt 15. Nov 2007, 14:04
die #10 hier ist mein Post

Zitat:
die Konsole wird nicht vom Konsolenprogramm erzeugt, folglich ...
das hab ich schon mitbekommen

und das Problem bei FreeConsole:
- erstmal müßte ich das Programm in eine ConsolenProgramm umwandeln > {$APPTYPE CONSOLE}
und dann darf ich auch wieder die Dateizugriffe prüfen/ändern (wegen Console=OEM und GUI=ANSI)
- dann sollte das Konsolenfenser ja nicht dableiben, wenn nicht von einer Konsole aus gestartet wurde
kein Ahnung wie ich das prüfen soll, aber FreeConsole gibt True zurück, wenn das "eigene" Konsolenfenster geschlossen werden konnte. (heißt von Konsole gestartet = False)

Hier kann man ja nur bis FreeConsole etwas ausgeben und später nicht mehr
und wenn das Konsolenfenstern wärend der Programmlaufzeit nicht angezeigt werden soll, muß dieses Fenster ja geich bei Programmstart geschlossen werden.
Delphi-Quellcode:
{$APPTYPE CONSOLE}
WriteLn('Programm gestartet');
FreeConsole;
Dieses wäre zwar eine Lösung (auch wenn sie nicht ganz optimal ist und erst seit XP funktioniert)
Delphi-Quellcode:
{$APPTYPE CONSOLE}
FreeConsole;
isConsole := AttachConsole(ATTACH_PARENT_PROCESS);

if isConsole then WriteLn('irgendwas');

@OregonGhost: werd mal reinsehn
$2B or not $2B
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#16

Re: Konsolenfenster im GUI-Mode unterdrücken

  Alt 15. Nov 2007, 14:32
Zitat von himitsu:
die #10 hier ist mein Post
Dann hat die DP einen Bug. Wenn man antwortet, wird mein Beitrag exakt davor als #10 angezeigt.

Zitat:
Hier kann man ja nur bis FreeConsole etwas ausgeben und später nicht mehr und wenn das Konsolenfenstern wärend der Programmlaufzeit nicht angezeigt werden soll, muß dieses Fenster ja geich bei Programmstart geschlossen werden.
Logisch. Aber wo ist dabei das Problem? Du muesstest im PEB des Elternprozesses rumwuehlen um an diese Informationen zu gelangen (inkl. Handles). Das laesst sich nur mit den entsprechenden Rechten auf den Elternprozess bewerkstelligen, was aber leider die ganze Geschichte wieder unpraktikabel macht.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Konsolenfenster im GUI-Mode unterdrücken

  Alt 15. Nov 2007, 14:47
PEB ... och nöööö

hab zwar och mal ein Programm gesehn, was wohl über 'nen Loader (wie z.B. bei UPX) gestartet wurde, welcher dann die entprechende Programmversion geladen hatte (dort war es 'ne DOS/Windows-Vesion oder so ... is schon lange her)
Miniaturansicht angehängter Grafiken
_10_158.jpeg  
$2B or not $2B
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#18

Re: Konsolenfenster im GUI-Mode unterdrücken

  Alt 16. Nov 2007, 10:45
Konnte mir dieses SF.net-Projekt nur flüchtig ansehen, sieht aber gut aus. Die scheinen einen anderen Weg zu gehen, der ohne die internen Strukturen des Elternprozesses (sprich, in unserem Fall PEB) auskommt. Der Lösungsansatz ist kreativ, mit der Einschränkung, daß auch hier Kompromisse her müssen.

Ich hatte mir mal was anderes überlegt gehabt, aber dann wieder verworfen (also nie probiert). Man könnte ja on-the-fly eine Kopie der EXE erstellen und ausführen, welche man zuvor im Header so modifiziert, daß das Subsystem auf Konsole steht. Natürlich bedeutet es in jedem Fall auch Frickelei.
Miniaturansicht angehängter Grafiken
zwischenablage02_191.png  
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Konsolenfenster im GUI-Mode unterdrücken

  Alt 23. Nov 2007, 12:06
Warum bin ich eigentlich nicht gleich draufgekommen AttachConsole als erstes aufzurufen?
(wozu FreeConsole ... AttachConsole sagt ja auch ob's erfolgreich war)

Das einzige Problem ist jetzt nur noch, daß AttachConsole erst ab XP verfügbar ist.
Und nachprogrammieren ist für mich etwas zu hoch ... hab mal reingeschaut und da werden Dinge aufgerufen, wo ich mit meinem Unwissen nicht rankomm.

Bei allem vor XP wird AttachConsoleDummy verwendet, welches einfach nur sagt daß es nicht ging
und ab XP funktioniert es so eigentlich perfekt. > es wird kine neue Konsole geöffnet und beim Programmstart blinkt auch Keine kurz auf.

Delphi-Quellcode:
{$APPTYPE GUI}

Uses Windows;

Function AttachConsoleDummy(dwProcessId: LongWord): LongBool;
  Begin
    Result := False;
  End;

Var AttachConsole: Function(dwProcessId: LongWord): LongBool; StdCall;
  ConsoleOutput: Boolean = False;




AttachConsole := GetProcAddress(GetModuleHandle('kernel32.dll'), 'AttachConsole');
If @AttachConsole = nil Then AttachConsole := @AttachConsoleDummy;

ConsoleOutput := AttachConsole(ATTACH_PARENT_PROCESS);




// und jetzt immer wenn zur Console verbunden wurde etwas reinschreiben
// > WriteLn erzeugt eine Exception, wenn keine Console vorhanden ist (darum ConsoleOutput)
If ConsoleOutput Then WriteLn('irgendwas');


Oder diese kleine Unit
Delphi-Quellcode:
Unit FSSystem;

Interface
  Var ConsoleOutput: Boolean = False;

  Procedure WriteConsole(S: String);

Implementation
  Uses Windows;

  Var AttachConsole: Function(dwProcessId: LongWord): LongBool; StdCall;

  Function AttachConsoleDummy(dwProcessId: LongWord): LongBool;
    Begin
      Result := False;
    End;

  Procedure WriteConsole(S: String);
    Begin
      If (S = '') or not ConsoleOutput Then Exit;
      UniqueString(S);
      CharToOemA(PAnsiChar(S), PAnsiChar(S));
      WriteLn(S);
    End;

Initialization
  AttachConsole := GetProcAddress(GetModuleHandle('kernel32.dll'), 'AttachConsole');
  If @AttachConsole = nil Then AttachConsole := @AttachConsoleDummy;

  ConsoleOutput := AttachConsole(ATTACH_PARENT_PROCESS);

End.
und im Programm dann jeweils einfach nur noch WriteConsole aufrufen
Delphi-Quellcode:
{$APPTYPE GUI}


WriteConsole('irgendwas');
Angehängte Dateien
Dateityp: pas fssysten_181.pas (775 Bytes, 28x aufgerufen)
$2B or not $2B
  Mit Zitat antworten Zitat
Assertor

Registriert seit: 4. Feb 2006
Ort: Hamburg
1.296 Beiträge
 
Turbo C++
 
#20

Re: Konsolenfenster im GUI-Mode unterdrücken

  Alt 16. Mai 2009, 11:45
Hi,

ich habe gerade mal AttachConsole ausprobiert. Es gibt ein Problem, daß nach dem Ende der Anwendung der Prompt nicht angezeigt wird und man einmal Enter drücken muß. Es sieht also so aus wie ein ReadLn() am Ende, jedoch wird alles getippte direkt ausgeführt. Es fehlt tatsächlich nur der Prompt ($p$g) der Befehlszeile am Ende... OS Vista x32, Delphi 2009.

Ist dies jemanden schon aufgefallen und gibt es eine Lösung?

Gruß Assertor
Frederik
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 08:41 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