console - schon offen?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

console - schon offen?

Beitrag von Toshy »

Wenn man in einem normalen Programm mit GUI eine Konsole öffnen will, oder einem Programm ganz ohne Benutzeroberfläche (bis dahin) um z.b. Fehlermeldungen auszugeben, muß man "openconsole" verwenden.

1. kann man heraus finden ob eine Konsole schon geöffnet wurde (z.b. das eigene Programm in einer Konsole gestartet wurde)
2. muß man auch dann, wenn das eigene Programm in einer Konsole aufgerufen wurde "openconsole" verwenden, weil z.b. nur dann bestimmte Bibliotheken von PB mit eingebaut und gestartet werden.

Gruß und Danke
Toshy
1. Win10
PB6.1
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: console - schon offen?

Beitrag von NicTheQuick »

Das verhält sich schon auf den verschiedenen Betriebssystemen unterschiedlich. Wenn ich unter Linux `OpenConsole()` schreibe, dann öffnet sich da zum Beispiel kein Fenster. Wenn ich das Executable-Format auf "Console" ändere, dann öffnet sich immer ein Konsolen-Fenster, auch wenn ich `OpenConsole()` gar nicht benutze. Was da im Hintergrund genau für ein Unterschied gemacht wird, weiß ich aber selbst nicht genau.
Bild
Axolotl
Beiträge: 154
Registriert: 31.12.2008 16:34

Re: console - schon offen?

Beitrag von Axolotl »

Toshy hat geschrieben:1. kann man heraus finden ob eine Konsole schon geöffnet wurde (z.b. das eigene Programm in einer Konsole gestartet wurde)
ich mache das unter windows so:

Code: Alles auswählen

;' windows only :-) 
EnableExplicit

Import "" 
  GetConsoleWindow() 
EndImport 

Macro IsConsole() 
  Bool(GetConsoleWindow())
EndMacro 

;' Test 
Debug IsConsole()
OpenConsole()
Debug IsConsole()
CloseConsole()
Debug IsConsole()
OpenConsole()
Debug IsConsole()
Input() 
Debug "Bye." 
Toshy hat geschrieben:2. muß man auch dann, wenn das eigene Programm in einer Konsole aufgerufen wurde "openconsole" verwenden, weil z.b. nur dann bestimmte Bibliotheken von PB mit eingebaut und gestartet werden.
Die Hilfe ist dein Freund. Unter OpenConsole() steht, dass man das als erstes Komando ausführen muss, damit die anderen Funktionen aus der Bibliothek funktionieren.
Wenn das Program aus einer console heraus gestartet wird, wird keine neue Console geöffnet.
Mostly running PureBasic <latest stable version and current alpha/beta> (x64) on Windows 11 Home
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Re: console - schon offen?

Beitrag von Toshy »

Danke für deine Hinweise
Toshy hat geschrieben:2. muß man auch dann, wenn das eigene Programm in einer Konsole aufgerufen wurde "openconsole" verwenden, weil z.b. nur dann bestimmte Bibliotheken von PB mit eingebaut und gestartet werden.
Die Hilfe ist dein Freund. Unter OpenConsole() steht, dass man das als erstes Komando ausführen muss, damit die anderen Funktionen aus der Bibliothek funktionieren.
Wenn das Program aus einer console heraus gestartet wird, wird keine neue Console geöffnet.[/quote]

Ich habe schon in die Hilfe geschaut, aber so klar steht das dort nicht, im Gegenteil, eher "verwirrend" steht es dort:
Sie sollten mit dem OpenConsole() Befehl beginnen, da Sie diesen Befehl zum Öffnen einer Konsole (Charakter-Modus) benutzen müssen, bevor Sie andere Befehle dieser Bibliothek verwenden.
"SOLLTEN" ist nicht "MÜSSEN". Und "zum ÖFFNEN einer KONSOLE benutzen MÜSSEN", weißt eher darauf hin, das man "OpenConsole()" nur zum tatsächlichen "öffenen" / "erstellen" der Grafischen Ausgabe auf einer Konsole (Print) nutzen muß. "bevor Sie andere Befehle dieser Bibliothek verwenden". ist hier nur verwirrend. Und würde wortwörtlich nur bedeuten, daß man diese Befehle zwar nutzen kann, aber sie dann (unter bestimmten Umständen) nicht funktionieren.

Alles unter Windows, nicht mit Linux getestet:

Code: Alles auswählen

  OpenConsole()
  PrintN("Warte 5 Sekunden vor dem Beenden...")
  Delay(5000)
In der IDE mit F5 gestartet und Debugger (kompelieren starten) öffnet sich die Konsole und das Programm wird abgearbeitet.

Code: Alles auswählen

  PrintN("Warte 5 Sekunden vor dem Beenden...")
In der IDE mit F5 gestartet und Debugger (kompelieren starten)
Kommt in der IDE eine Fehlermeldung "Es ist derzeicht keine Konsole geöffnet". Allerdings ging das komplieren ohne Fehlermeldung.

Code: Alles auswählen

 PrintN("Warte 5 Sekunden vor dem Beenden...")
  Delay(5000)
läßt sich ohne Fehler kompilieren und Programm starten (es passiert allerdings nichts sichtbares) und es kommt wohl auch nicht zu einem "Delay", also keinem Warten.
Die exe liefert auch in einer mit CMD geöffneten Konsole keine Ausgabe, es gibt aber auch keine Fehlermeldung.

Code: Alles auswählen

 PrintN("Warte 5 Sekunden vor dem Beenden...")
  Delay(5000)
als "echte console" (Kompilereinstellung)
kompeliert öffnet ein Konsolenfenster, es kommt zu keiner Textausgabe, aber das "Delay" wird ausgeführt.

Wenn ich je die Version mit "echter konsolenkomeplierung" und "ohne" (als WIndowsprogramm) als Exe in der Konsole aufrufe, wird die "echte Konsolenanwendung" abgearbeitet (delay), nicht aber bei der Windowsanwendung. Zu einer Ausgabe kommt es in beiden Fällen nicht.

Erstelle ich aber eine "Echte Konsolenanwendung" mit

Code: Alles auswählen

OpenConsole()
  PrintN("warte")
  ;Delay(5000)
  PrintN("starte")
  RunProgram("TEMPohneopenconsole1.exe" , "", "", #PB_Program_Wait)
"TEMPohneopenconsole1.exe" beinhaltet

Code: Alles auswählen

 PrintN("Warte 5 Sekunden vor dem Beenden...")
  Delay(5000)
wird das Delay der zweiten Exe anscheined ausgeführt.

Ein wenig eigenartig ist das Verhalten schon.

Im Endeffekt geht es mir aber darum, ob es "Probleme" geben könnte oder was der Standart ist bezüglich "openconsole()", wenn schon eine Console geöffnet ist. Ob dies erlaubt ist laut STandart, oder nicht, oder ob PB selbst überprüft ob so eine Console schon geöffnet ist.


Rbei mir öffnet sich aktuell als "echte Konsolenanwendung" auch unter Windows schon ein Konsolenfenster, wie auch als WIndowsanwendung.

Ich will eventuell einige kleine Helferlein für mich erstellen, die gar keine Anzeige haben beim Standardablauf, und nur dann, wenn ich einen Parameter oder Fehler oder so ausgeben will. Dann kann ich "openconsole()" zwar einfach später einbauen,
nur wenn dann der Programmcode gar niicht ausgeführt wird, ... was hilft es mir dann.

Ich habe bisher noch nicht soooo viel damit getestet, aber daher habe ich schon mal angefragt.

Code: Alles auswählen

For i = 1 To 5
  OpenConsole()
  PrintN(Str(i))
  Delay(2500)
  ;PrintN("starte")
  ;RunProgram("TEMPohneopenconsole1.exe" , "", "", #PB_Program_Wait)
  CloseConsole()
  Delay(2500)
Next i

Als Exe mit Mausklick gestartet:
Als Windowsanwendung öffnet und schließt die Konsole sichtbar, und öffnet sie wieder(mehrfach) das Programm wird ausgeführt.
Als "Konsolenanwendung" wird da Programm zwar auch ausgeführt, das Konsolenfenster schließt sich allerdings nicht.

In der CMD Konsole von Windows:

Als Windowsanwendung öffnet und schließt ein zweites Konsolenfenster sichtbar, und öffnet sie wieder(mehrfach) das Programm wird ausgeführt.
Als "Konsolenanwendung" wird da Programm zwar auch ausgeführt, aber es öffnen und schließen sich keine Fenster.

Ebenso wird dann die KonsolenAUSGABE auch jeweil an unterschiedlichen Stellen ausgegeben. Also Konsolenanwendung im Aufrufenden Fenster, als Windowsanwenung im neuen Konsolenfenster.

In meinem Helferprogramm das ich gerade erstellt habe um mir die Arbeit vom Umwandeln von Android-User-Apps in Systemapps zu erleichern, hatte ich als Windowsanwendung komiliert (Natürlcih mit Opencosole()).
Innerhalb meines Programmes rufe ich selber andere Programme auf (z.B. 7zip) zum zippen. Dieses Programm gibt dann in "meinem" Consolenfenster seine Ausgabe aus (ich nutze die Readfunkionen aus PB aus der Hilfe) und öffnet kein Extra Fenster.

Daher war ich jetzt verwundert.

Da in der sonst echt EXTREM guten PB-Hilfe hier kein Hinweis auf die unterschiedlichen Verhaltensweisen beschrieben ist, und man auch nicht mit allgemeinen Infos aus dem Internet sicher sein kann was PB selbst mit dem Aufruf von "opensconole()" alles macht oder nicht, stelle ich hier die Fragen.

Als Konsolenanwendung schein "PB" zu überprüfen ob ein Fenster besteht, falls nicht öffnet es eines, aber schließt es nur wenn das PRG zu ende ist. Was als Consolenprogramm ja noch sinnig ist. Aber warum es (direkt als Exe aufgerufen mit Mausklick) sich bezüglich dem Fenster anders verhält als die Windows version verstehe ich nicht wirklich.


Openconsole und Closeconsole scheine also, zumindest bei der Windowsanwendung, Consolenfenster öffnen und schließen zu können.
Was ich nun ja nicht will ist, das ein fremdes Konsolenfenster (eines Programmes das mein PRG aufruft) von meinem "closeconsole" geschlossen werden könnte, aber ich will auch nicht, das ein Extra fenster aufgeht. Ob es hier daher in PB "eigene Sicherheitsabfragen" gibt, oder wie das läuft, ist mir halt nicht klar.

Interessant ist auch, das ich z.b. zwei Programme erstellt habe

TEMPDelayWindows.exe
TEMPDelayKonsole.exe

Sie beinhalten nur ein 10 Sekündiges Delay.

Ausgeführt in der Windows Konsolenaufforderung bleibt stoppt die CMD-Konsole bis mein PRG ausgeführt ist, sobald ich meine "Konsolenversion" nutze, nutze ich die "Windowsanwendungsversion" stoppt die CMD nicht (es wird also sofort eine neue Eingabe möglich. In beiden Fällen wird das Programm aber ausgeführt (sehe ich im Taskmanager).



TEMPDelayPrintNWindows.exe
TEMPDelayPrintNKonsole.exe.pb

beinhalten

Code: Alles auswählen

PrintN("Warte 5 Sekunden vor dem Beenden...")
Delay(10000)
mit Mausklick gestartet
wird beider Programmcode ausgeführt. im Taskmanger ist das Programm für 10 Sekunden zu sehen. Wenn es auch keine Textausgabe gibt.
In der Konsole gleiches Verhalten.

Ich vermute daher zu meinen obigen ersten Test, das meine Beobachtungen (da noch nicht mit Taskmanager beobachtet), daß Consolenanwendungen (unabhängig von dem Thema openconsole, um das es hier ja eigendlich geht) ein anderes Verhalten an den Tag legen.


In der IDE kompeliert und gestartet löst

Code: Alles auswählen

CloseConsole()

eine Fehlermeldung durch die IDE aus (Es ist derzeit kein Konsole geöffnet...). Egal ob ich "Konsolenanwendung" oder "Windowsanwendung" ein den Einstellungen gewählt habw. in der Konsolenanwendungsversion wird allerdings das Konsolenfenster geöffnet.

Zumindest schließt, hier habe ich auch noch getestet

Code: Alles auswählen

CloseConsole()
auch keine Konsole die vorher schon geöffnet war (CMD), egal ob als Windows- oder Consolenanwendung.

Das unterschiedliche Verhalten (wenn als Konsole oder von anderem Consolenprogramm gestartet bzw. von der Windowskonsole) bezüglich als "Konsolenanwendung" oder als "Windowsanwendung" kompiert (es wartet auf das Ende des Programms, oder halt nicht), kann ich ja noch nachvollziehen, auch wenn es mich etwas wundert.
Denn dann kann man ein Consolenprogramm (zumindest in der Windowskonsole) nicht starten und im Hintergrund laufen lassen und weiter arbeiten (ohne neu Konsole).

Das dann aber eine Konsolenfenster bei einer Konsolenanwendung ZWANGSWEISE gestartet wird, aber nicht entsprechende "Bibliothek" und die Ausgabe automatisch möglichist, verwundert mich ann doch.

Ob nun PB dieses Fenster öffnet oder dies zwangsweise von Windows so geschieht, wäre doch interessant zu wissen.

Für die Ausgabe und Funktion von Consolenanwendungen, besonders wenn ich nur ein Programm starten will, das im Hintergrund abläuft, muß ich noch ein Gefühl bekommen.

Zwar erstelle ich das Programm "nur für mich", aber ich überlege, ob ich es als Linuxversion (wie auch immer ich das komepieren kann!? Vermutlich muß ich dazu Linux installieren) später mal für den einen oder anderen Androidimagebastler zur verfügung zu stellen.
Da wäre schon interessant, wie sich die Programme verhalten....

Ich habe meine obigen Test nur veröffentlich, damit ein zukünftiger Leser, und sei es in Jahren, einige Hinweise und Test schon mal erlesen kann.

Ich stoße ja auch oft auf sehr alte Foreneinträge zu themen, die einem weiter helfen, und sei es mit "neuen Fragen" die einem dann durch den Kopf ströhmen.

Danke soweit erstmal.
1. Win10
PB6.1
Antworten