Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » system() öffnet Kommandozeilenfenster

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
08.05.2008, 19:31 Uhr
DeeDee0815



Guten Tag,

dies ist mein erster Beitrag in diesem Forum, und ich hoffe nicht gleich zu Anfang in den falschen Bereich zu posten. Meine Frage ist eine Mischung aus ANSI-C++, Win32-API und GNU/Linux.

Um eine Art Java-Launcher zu erstellen, habe ich folgendes simples Programm geschrieben:


C++:
#include <iostream>
#include <stdlib.h>

int main(int argc, char** argv)
{
    system("java -jar Application.jar");
    return 0;
}



Läuft auch alles einwandfrei: Das Programm wird im Sinne eines Java-Launchers für Windows und Linux, später auch für Mac, übersetzt. Einziger Haken: Unter Windows öffnet sich ein Kommandozeilenfenster beim Start. Dieses beendet sich auch erst nach dem Terminieren des Java-Prozesses. Wie kann man das öffnen dieses Fensters verhindern und das Programm trotzdem noch mit GCC kompilieren können? Denn ich will nicht soetwas wie ShellExecute() nehmen: Das geht ja nur mit dem Visual CPP-Kompiler.

MfG
DeeDee0815
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.05.2008, 20:05 Uhr
xXx
Devil


Nein das geht auch mit jedem Compiler, ist allerdings an Windows gebunden. (ShellExecute)
std::system öffnet eine Konsole und darin wird dann wird der Befehl zum öffnen von dieser verarbeitet und wenn der Prozess beendet wird, schließt sich auch die Konsole wieder, denn sie hat keinen Grund mehr aufzubleiben, da dein Programm abgearbeitet ist. Also ist das Verhalten doch korrekt!

Korrekt wäre dein Code übrigens:

C++:
#include <cstdlib>

int main()
{
    std::system("java -jar Application.jar");
}
. Wofür brauchst du das überhaupt? Leg doch einfach eine Verknüpfung im Autostartordner an, die das macht?!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.05.2008, 20:17 Uhr
0xdeadbeef
Gott
(Operator)


Naja, einfach zum Starten eines anderen Programms, wenn du sonst nichts weiter machen willst, gibt es die exec*-Funktionen. Zum Beispiel

C++:
#include <unistd.h>

int main(void) {
  /* Kehrt nie zurück */
  execlp("java", "-jar", "Application.jar", NULL);
}


...allerdings frage ich mich dann, warum du nicht einfach eine Batch-Datei bzw. ein Shell-Skript benutzt.

Wenn das Programm nach dem Aufruf des anderen Programms - oder während es läuft - noch etwas machen soll, dann sieht das - eine POSIX-Runtime vorausgesetzt - in etwa so aus:

C++:
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>

int main() {
  pid_t pid;
  int status;

  pid = fork(); // Neuen Prozess erstellen

  if(pid == 0) {
    // Wir befinden uns im Kindprozess
    execlp("java", "-jar", "Application.jar", NULL);
  }

  // Wir befinden uns im Vaterprozess, weil execlp nie zurückkehrt
  waitpid(pid, &status, 0); // <-- Warten, bis der Kindprozess zu Ende ist

  // Rest hier
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
09.05.2008, 00:13 Uhr
DeeDee0815



Hi xXx und 0xdeadbeef,

vielen Dank für eure sehr schnellen Reaktionen:

@xXx:
Es würde mir ja wie gesagt nicht viel nützen, wenn es nur unter Windows gehen würde, also wenn ich ShellExecute() nehmen würde: Java-Programme werden ja im Allgemeinen plattformunabhängig verwendet. Natürlich ist diese Launch-Datei nicht plattformunabhängig, aber ansonsten gibt es nur recht wenig Portierungsaufwand. Des weiteren habe ich mich doch gar nicht über "fehlerhaftes Verhalten" von system() beklagt, sondern eher nach einer Alternative gefragt: Damit war ganz sicher kein Eintrag im "Autostartordner" gemeint. Trotzdem vielen Dank für Deine Antwort.

@0xdeadbeef:
Das ist genau das, was ich gesucht habe: Eine Methode, die den Prozesszeiger standartmäßig verwirft und keine Shells unter Windows öffnet. In der Tat könnte ich Batch-Dateien oder Shell-Skripte mitliefern. Aber irgendwie finde ich das mit einem Programm besser. Da kann man auch absolut sicher sein, dass es ausgeführt wird und nicht irgendwie vermurkst verknüpft ist. Wobei das ja bei Shell-Skripts eigentlich auch nicht passieren sollte...

MfG
DeeDee0815
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
09.05.2008, 17:26 Uhr
DeeDee0815



Hi,

ich bins nochmal. Leider gibt es doch einige Probleme. Wenn unter Windows der NULL-Parameter angegeben ist, kompiliert MinGW das Programm nicht und beschwert sich darüber, dass NULL nicht definiert ist. Entfernt man diesen Parameter, ist das Kompilieren zwar erfolgreich, das Programm verursacht beim Start aber eine Fehlermeldung. Als ob das noch nicht schlimm genug wäre, öffnet sich dabei auch noch ein ungewolltes Kommandozeilenfenster.

Unter Linux läuft das Programm zwar, nur leider werden die Parameter an die JVM falsch übergeben. Denn es gibt eine Exception die besagt, die JAR-Datei könne nicht gefunden werden. Muss man bei diesem Befehl etwa absolute Pfade angeben?

MfG
DeeDee0815
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
09.05.2008, 18:00 Uhr
0xdeadbeef
Gott
(Operator)


Am Anfang des Programms einfach

C++:
#include <stddef.h>


einfügen, bzw.

C++:
#include <cstddef>


wenn es sich um ein C++-Programm handelt. Oder NULL durch 0 ersetzen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: