.exe Dateien werden nicht gestartet obwohl Pfad richtig

Janericson

Mitglied
Hallo,

ich habe mir folgendes Projekt rausgesucht : Ich programmiere ein Installer, der je nachdem welche Programme ich auswähle, diese dann auch nacheinander installieren soll. Auswählen kann man die Programme über Checkboxen. Prinzip ist klar, nur die Programme deren Checkbox ausgewählt wurde, sollen installiert werden. Die Pfade zu den jeweiligen .exe Dateien liegen in einer von mir erstellten Textdatei. Mein Programm soll alle 10 Pfade auslesen, sie in verschiedene Strings abspeichern und je nach Auswahl in diesem Pfad die Installationsdatei starten. Ich habe allerdings folgendes Problem: Um mir viele verschiedene Pfade zu vermeiden habe ich alle 10 .exe Dateien in einen Ordner kopiert, d.h. je nach Programm ist im Pfad nichts anders, außer der Dateiname. Bei Origin und Opera funktioniert alles einwandfrei, möchte ich aber Steam oder etwas anderes installieren kommt eine Exception. Ich hab schon einiges versucht, das kuriose : verwende ich bei der Opera Checkbox den Pfad von z.b. Steam klappt auch das nicht mehr, ich bekomme meine eigene Fehlermeldung angezeigt. Nur Opera und Origin können gestartet werden bei allen anderen kommt eine Exception. Habe ich vielleicht irgendwas übersehen oder falsch gemacht? und hat Jemand eine Idee wie ich die 10 Checkboxen nicht nur mit Millionen von if-Anweisungen programmieren kann? Es sind ja bei 2 Checkboxen schon 3 if-Anweisungen

Ich lade noch ein Bild vom fertigen Programm hoch, sowie von der Textdatei und dem Ordner, indem alle exe dateien liegen

Installer.PNG Installer2.PNG Installer3.PNG

Hier mein Quellcode :

Java:
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.io.*;
import javax.swing.JOptionPane;
import javax.swing.DefaultListModel;
import javax.swing.UIManager;
import java.awt.Color;
public class Installer extends JFrame {
    private JPanel contentPane;
    String path1;
    String path2;
    String path3;
    String path4;
    String path5;
    String path6;
    String path7;
    String path8;
    String path9;
    String path10;
   
    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        try {
            UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
        } catch (Throwable e) {
            e.printStackTrace();
        }
       
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Installer frame = new Installer();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the frame.
     */
    public Installer() {
        setBackground(Color.CYAN);
       
        try
        {
        FileReader fr = new FileReader("C:/Users/The5thBluesky/Desktop/Path.txt");
        BufferedReader br = new BufferedReader(fr);

        path1 = br.readLine();
        System.out.println(path1);
        path2 = br.readLine();
        System.out.println(path2);
        path3 = br.readLine();
        System.out.println(path3);
        path4 = br.readLine();
        System.out.println(path4);
        path5 = br.readLine();
        System.out.println(path5);
        path6 = br.readLine();
        System.out.println(path6);
        path7 = br.readLine();
        System.out.println(path7);
        path8 = br.readLine();
        System.out.println(path8);
        path9 = br.readLine();
        System.out.println(path9);
        path10 = br.readLine();
        System.out.println(path10);
        br.close();
        }
        catch (IOException ex)
        {
            JOptionPane.showMessageDialog(null, "Das ging wohl schief");
        }
       
       
       
       
       
       
       
       
       
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 600, 564);
        contentPane = new JPanel();
        contentPane.setBackground(new Color(245, 255, 250));
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
       
        JTextPane txtpnDiesesProgrammWird = new JTextPane();
        txtpnDiesesProgrammWird.setEditable(false);
        txtpnDiesesProgrammWird.setText("Dieses Programm wird dazu verwendet, um nach einer Auswahl an Programmen, diese zu installieren. W\u00E4hlen sie dazu unten einfach die Programme aus die sie installieren m\u00F6chten und klicken sie dann auf INSTALL.");
        txtpnDiesesProgrammWird.setBounds(37, 12, 460, 58);
        contentPane.add(txtpnDiesesProgrammWird);
       
        JLabel lblOperaInstall = new JLabel("Opera wird jetzt installiert");
        lblOperaInstall.setBounds(236, 302, 199, 14);
        contentPane.add(lblOperaInstall);
       
        JLabel lblOriginInstall = new JLabel("Origin wird jetzt installiert");
        lblOriginInstall.setBounds(236, 337, 147, 14);
        contentPane.add(lblOriginInstall);
       
        JCheckBox checkbxOrigin = new JCheckBox("Origin\r\n");
        checkbxOrigin.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (checkbxOrigin.isSelected()){
                    lblOriginInstall.setVisible(true);
                    }
                    else
                    {
                    lblOriginInstall.setVisible(false);
                    }
            }
        });
        checkbxOrigin.setBounds(37, 333, 97, 23);
        contentPane.add(checkbxOrigin);
       
        JCheckBox checkbxOpera = new JCheckBox("Opera");
        checkbxOpera.setForeground(new Color(0, 0, 0));
        checkbxOpera.setBackground(new Color(0, 0, 0));
        checkbxOpera.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (checkbxOpera.isSelected()){
                lblOperaInstall.setVisible(true);
                }
                else
                {
                lblOperaInstall.setVisible(false);
                }
            }
        });
        checkbxOpera.setBounds(37, 298, 97, 23);
        contentPane.add(checkbxOpera);
       
        JCheckBox checkbxArduino = new JCheckBox("Arduino IDE");
        checkbxArduino.setBounds(37, 268, 104, 18);
        contentPane.add(checkbxArduino);
       
        JCheckBox checkbxCCleaner = new JCheckBox("CCleaner");
        checkbxCCleaner.setBounds(37, 238, 104, 18);
        contentPane.add(checkbxCCleaner);
       
        JCheckBox checkbxDevC = new JCheckBox("Dev- C++\r\n");
        checkbxDevC.setBounds(37, 208, 104, 18);
        contentPane.add(checkbxDevC);
       
        JCheckBox checkbxGeogebra = new JCheckBox("GeoGebra");
        checkbxGeogebra.setBounds(37, 178, 104, 18);
        contentPane.add(checkbxGeogebra);
       
        JCheckBox checkbxMicrosoft = new JCheckBox("Microsoft Office 365");
        checkbxMicrosoft.setBounds(37, 148, 136, 18);
        contentPane.add(checkbxMicrosoft);
       
        JCheckBox checkbxSteam = new JCheckBox("Steam");
        checkbxSteam.setBounds(37, 118, 104, 18);
        contentPane.add(checkbxSteam);
       
        JCheckBox checkbxTeamspeak = new JCheckBox("Teamspeak");
        checkbxTeamspeak.setBounds(37, 368, 104, 18);
        contentPane.add(checkbxTeamspeak);
       
        JCheckBox checkbxWinRAR = new JCheckBox("WinRAR");
        checkbxWinRAR.setBounds(37, 398, 104, 18);
        contentPane.add(checkbxWinRAR);
       
        JLabel lblTeamspeakWirdJetzt = new JLabel("TeamSpeak wird jetzt installiert");
        lblTeamspeakWirdJetzt.setBounds(236, 369, 199, 16);
        contentPane.add(lblTeamspeakWirdJetzt);
       
        JLabel lblWinrarWirdJetzt = new JLabel("WinRAR wird jetzt installiert");
        lblWinrarWirdJetzt.setBounds(236, 399, 181, 16);
        contentPane.add(lblWinrarWirdJetzt);
       
        JLabel lblArduinoIdeWird = new JLabel("Arduino IDE wird jetzt installiert");
        lblArduinoIdeWird.setBounds(236, 268, 168, 16);
        contentPane.add(lblArduinoIdeWird);
       
        JLabel lblCcleanerWirdJetzt = new JLabel("CCleaner wird jetzt installiert");
        lblCcleanerWirdJetzt.setBounds(236, 239, 199, 16);
        contentPane.add(lblCcleanerWirdJetzt);
       
        JLabel lblDevcWirdJetzt = new JLabel("Dev-C++ wird jetzt installiert");
        lblDevcWirdJetzt.setBounds(236, 209, 219, 16);
        contentPane.add(lblDevcWirdJetzt);
       
        JLabel lblGeogebraWirdJetzt = new JLabel("GeoGebra wird jetzt installiert");
        lblGeogebraWirdJetzt.setBounds(236, 179, 219, 16);
        contentPane.add(lblGeogebraWirdJetzt);
       
        JLabel lblMicrosoftOffice = new JLabel("Microsoft Office 365 wird jetzt installiert");
        lblMicrosoftOffice.setBounds(236, 149, 273, 16);
        contentPane.add(lblMicrosoftOffice);
       
        JLabel lblSteamWirdJetzt = new JLabel("Steam wird jetzt installiert");
        lblSteamWirdJetzt.setBounds(236, 119, 168, 16);
        contentPane.add(lblSteamWirdJetzt);
       
        JButton btnNewButton = new JButton("INSTALL");
        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {

                if (checkbxOpera.isSelected() && checkbxOrigin.isSelected())
                {
                    try
                    {
                        Runtime rOp = Runtime.getRuntime();
                        Process rt = rOp.exec(path5);
                        rt.waitFor();
                        JOptionPane.showMessageDialog(null, "Opera wurde erfolgreich installiert");
                        Runtime rOr = Runtime.getRuntime();
                        Process rp = rOr.exec(path6);
                        rp.waitFor();
                        JOptionPane.showMessageDialog(null, "OK");
                    }
                    catch( IOException | InterruptedException ex)
                    {
                        JOptionPane.showMessageDialog(null, "Ein Fehler ist aufgetreten! Möglicherweise " +
                        "existiert die Datei nicht, oder der Pfad ist falsch!");
                    }
                }
                else if (checkbxOrigin.isSelected())
                {
                    try
                    {
                        Runtime rOr = Runtime.getRuntime();
                        Process rp = rOr.exec(path6);
                        rp.waitFor();
                        JOptionPane.showMessageDialog(null, "OK");
                    }
                    catch( IOException | InterruptedException ex)
                    {
                        JOptionPane.showMessageDialog(null, "Ein Fehler ist aufgetreten! Möglicherweise " +
                        "existiert die Datei nicht, oder der Pfad ist falsch!");
                    }
                }
                else if (checkbxOpera.isSelected())
                {
                    try
                    {
                        Runtime rOp = Runtime.getRuntime();
                        Process rt = rOp.exec(path5);
                        rt.waitFor();
                        JOptionPane.showMessageDialog(null, "Opera wurde erfolgreich installiert");
                    }
                    catch( IOException | InterruptedException ex)
                    {
                        JOptionPane.showMessageDialog(null, "Ein Fehler ist aufgetreten! Möglicherweise " +
                        "existiert die Datei nicht, oder der Pfad ist falsch!");
                    }
                }
                else
                {
                    JOptionPane.showMessageDialog(null, "Kein Programm wurde ausgewählt");
                }
                       
            }
               
        });
        btnNewButton.setBounds(414, 465, 147, 39);
        contentPane.add(btnNewButton);
       
       
       
    }
}
 
kann es vielleicht an fehlenden Systemberechtigungen liegen?

oder auch zu viele Installer werden gleichzeitig ausgeführt, sodass einer abgebrochen oder gar nicht erst ausgeführt wird, da gerade ein anderes Programm installiert wird
 
wie könnte ich prüfen ob es an den Systemberechtigungen liegt?

das zu viele gleichzeitig gestartet werden ist sehr unwahrscheinlich, da ich durch xy.waitFor(); ja darauf warte bis der Prozess beendet wurde und lasse das Programm erst dann weiterlaufen, das funktioniert auch habe ich getestet. Lasse ich den Befehl raus wird "JOptionPane.showMessageDialog(null, "Opera wurde erfolgreich installiert");" noch vor dem Prozessstart ausgeführt, mit dem waitFor-Befehl erst nach dem die Installation fertig oder abgebrochen ist

trd danke für die Antwort wäre sehr dankbar für weitere...
 
Läuft deine Applikation mit Admin-Rechten? Wenn nicht, dann kannst Du das einmal ausprobieren.

Und was für eine Exception bekommst Du? Habe ich das übersehen oder hast Du das nicht angegeben?

Konrad
 
danke für die antwort wie genau kann ich denn das Programm über Eclipse oder JCreator als Administrator starten?

Ich weiß leider nicht 100% welche Exception ich bekomme weil ich ja 2 arten der exception abfange und dem entsprechend eine Nachricht ausgeben lasse. In Eclipse bekomme ich ja dann leider nicht wie sonst wenn man sie nicht abfängt den Fehler in der Console angezeigt, kann aber die Befehle auch nciht ohne try und catch ausführen weil sonst der Compiler mäckert. Also wie könnte ich trotzdem nachvollziehen was in meinem Code nicht stimmt?
 
es lag tatsächlich an den Rechten ich glaubs nicht -.- wenn ich eclipse mit admin rechten ausführe kann ich auf einmal jeden einzelnen Pfad benutzen und die exe dateien starten alle -.- gibt es eine möglichkeit im Quellcode mir adminrechte zu verpassen? wenn ich eine Exe datei starte werde ich ja manchmal auch darum befragt ob ich das wirklich machen will und vergebe dem so die admin rechte geht das hier irgendwie auch?
 
Unter Windows kann man ein manifest File zu einer Exe Datei legen, in dem definiert wird, was für Rechte notwendig sind für die Applikation.

Somit müsstest Du erst eine exe erstellen bzw. bekommen. Dazu wäre der folgende Weg notwendig:
a) jar Datei mit Deiner Applikation erstellen.
b) launch4j (oder ein anderes Tool) nutzen um die exe zu erhalten
c) Manifest Datei hinzufügen. Wenn Deine App meineapp.exe ist, dann muss das manifest File meineapp.manifest sein. Inhalt wäre z.B. folgendes denkbar:
Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="highestAvailable"   uiAccess="False"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>

Das uiAccess solltest Du nur auf true setzen, wenn Du von Deiner Applikation aus auch auf andere Applikationen zugreifen willst (Also den laufen Applikationen Nachrichten schicken willst). Das ist zumindest mein aktuelles Verständnis dieses Flags. Das False kannst Du da also erst einmal lassen.

Konrad
 

Zurück
Oben