Runtime.getRuntime().exec(“path to file”) runs, but program acts strange

筅森魡賤 提交于 2019-12-08 10:26:46

问题


I am making a text based launcher for a number of programs. I am using the Runtime.getRuntime().exec("path//to//file.exe")) method.

The program will run, it always will, but some act weirdly or fail to find critical .dll files that are there. Others have text messed up while running etc. As you can see, these are all games which are complex and use a number of engines I don't understand. Thanks!

Dead Space 3: Screen is black, game runs though. Only display seems to not be working

MW3: TeknoMW3.exe cant find teknomw3.dll even though they are in the same folder(and launching it normally makes it run fine).

Endless Space: Text is displayed strangely. Exit is %getuserexit% or something akin to that for every space where text should and normally is displayed. Only occurs on main menu.

Splinter Cell Blaclist: Dir is correct, cant find the specified file. Ill jut work around that one.

Bioshock 1: Straight up crashes(might be due to a .dll problem again, I dont actualy know though)

Bioshock 2: Never runs. file is executed but doesnt run.

public class Main {

static int launcherNum = 14;

static Launchers launchers[] = new Launchers[launcherNum];

static Launchers assassinsCreed3 = new Launchers("G://Games//ROMS//Assassins Creed III//AC3SP.exe", "Assassians Creed III (AC3)");
static Launchers bioshock = new Launchers("G://Games//ROMS//Bioshock//Builds//Release//Bioshock.exe", "Bioshock");
static Launchers bioshock2 = new Launchers("G://Games//ROMS//Bioshock 2//SP//Builds//Binaries//Bioshock2.exe", "Bioshock 2");
static Launchers bioshock3 = new Launchers("G://Games//ROMS//Bioshock Infinite//Binaries//Win32//BioShockInfinite.exe", "Bioshock Infinite");
static Launchers borderlands2 = new Launchers("G://Games//ROMS//Borderlands 2//Binaries//Win32//Borderlands2.exe", "Borderlands 2");
static Launchers mw3 = new Launchers("G://Games//ROMS//Call of Duty- Modern Warfare 3//TeknoMW3.exe", "Call of Duty: Modern Warefare 3 (MW3)");
static Launchers deadSpace3 = new Launchers("G://Games//ROMS//Dead Space 3//deadspace3.exe", "Dead Space 3");
static Launchers endlessSpace = new Launchers("G://Games//ROMS//Endless Space//EndlessSpace.exe", "Endless Space");
static Launchers prototype2 = new Launchers("G://Games//ROMS//PROTOTYPE 2//Prototype2.exe", "Prototype 2");
static Launchers leagueOfLegends = new Launchers("G://Games//ROMS//lol.launcher.exe", "League of Legends");
static Launchers rct3 = new Launchers("G://Games//ROMS//RCT3//RCT3plus.exe", "Rollercoaster Tycoon 3");
static Launchers splitSecond = new Launchers("G://Games//ROMS//Split  Second//SplitSecond.exe", "Split Second");
static Launchers skyrim = new Launchers("G://Games//ROMS//The Elder Scrolls V Skyrim//TESV.exe", "The Elder Scrolls: Skyrim");
static Launchers tcSplinterCell = new Launchers("G://Games//ROMS//Tom Clancys Splinter Cell  Blacklist//src//SYSTEM//Blacklist_DX11_game.exe", "Tom Clancy's: Splinter Cell Blacklist");

public static void initLauncher() {

    //adds AC3
    launchers[0] = assassinsCreed3;

    //Adds all 3 Bioshocks. God its hard to write "Bioshock"
    launchers[1] = bioshock;
    launchers[2] = bioshock2;
    launchers[3] = bioshock3;

    //Adds Borderlands 2
    launchers[4] = borderlands2;

    //Adds MW3
    launchers[5] = mw3;

    //Adds Dead Space 3
    launchers[6] = deadSpace3;

    //Adds Endless Space
    launchers[7] = endlessSpace;

    //Adds Prototype 2
    launchers[8] = prototype2;

    //Adds League of Legends... yeah, I know.
    launchers[9] = leagueOfLegends;

    //Adds RCT3
    launchers[10] = rct3;

    //Adds Split Second
    launchers[11] = splitSecond;

    //Adds skyrim
    launchers[12] = skyrim;

    //Adds Splinter Cell
    launchers[13] = tcSplinterCell;
}

public static void runLaunchers() {

    boolean done = false;
    String input1;
    Scanner input = new Scanner(System.in);

    while(done == false) {
        System.out.println("Welcome to the Cracked Game Launcher, also know     as CSteam. This is a product of the labors of ASIGTX. Do not redistribute.\n Ever");
        System.out.println("Please select a game from our libraires.");
        System.out.println();
        for (Launchers l: launchers) {  
            if (l.launcherName != null) {
            System.out.println(l.launcherName);
            System.out.println();
            }//end of if loop
        }//end of for loop

        input1 = input.nextLine();

        switch (input1) {

        case "Assassins Creed 3":
        case "AC3":
            launchers[0].launchEXE();
            if (launchers[0].hasLaunched == true) {
                done = true;
            }//end of if
            break;

        case "Bioshock":
            launchers[1].launchEXE();
            if (launchers[1].hasLaunched == true) {
                done = true;
            }//end of if
            break;

        case "Bioshock 2":
            launchers[2].launchEXE();
            if (launchers[2].hasLaunched == true) {
                done = true;
            }//end of if
            break;

        case "Bioshock Infinite":
            launchers[3].launchEXE();
            if (launchers[3].hasLaunched == true) {
                done = true;
            }//end of if
            break;

        case "Borderlands 2":
            launchers[4].launchEXE();
            if (launchers[4].hasLaunched == true) {
                done = true;
            }//end of if
            break;

        case "MW3":
        case "Call of Duty: Modern Warefare 3":
            launchers[5].launchEXE();
            if (launchers[5].hasLaunched == true) {
                done = true;
            }//end of if
            break;

        case "Dead Space 3":
            launchers[6].launchEXE();
            if (launchers[6].hasLaunched == true) {
                done = true;
            }//end of if
            break;

        case "Endless Space":
            launchers[7].launchEXE();
            if (launchers[7].hasLaunched == true) {
                done = true;
            }//end of if
            break;

        case "Prototype 2":
            launchers[8].launchEXE();
            if (launchers[8].hasLaunched == true) {
                done = true;
            }//end of if
            break;

        case "League of Legends":
            launchers[9].launchEXE();
            if (launchers[9].hasLaunched == true) {
                done = true;
            }//end of if
            break;

        case "Rollercoaster Tycoon 3":
            launchers[10].launchEXE();
            if (launchers[10].hasLaunched == true) {
                done = true;
            }//end of if
            break;

        case "Split Second":
            launchers[11].launchEXE();
            if (launchers[11].hasLaunched == true) {
                done = true;
            }//end of if
            break;

        case "The Elder Scrolls: Skyrim":
        case "Skyrim":
            launchers[12].launchEXE();
            if (launchers[12].hasLaunched == true) {
                done = true;
            }//end of if
            break;

        case "Tom Clancy's: Splinter Cell Blacklist":
        case "Splinter Cell Blacklist":
            launchers[13].launchEXE();
            if (launchers[13].hasLaunched == true) {
                done = true;
            }//end of if
            break;

        }//end of switch    
    }//end of while loop

}


public static void main(String[] args) {

    initLauncher();
    runLaunchers();

}//end of main

}//end of class





public class Launchers {

public boolean hasLaunched = false;
public String launcherName;

private String dir;


public Launchers(String dir, String namein) {
    setName(namein);
    this.dir = dir; 
}//end of constructor

public void setName(String s) {
    launcherName = s;
}//end of setname
public String getDir() {
    return dir;
}


public void launchEXE() {

    String runtimeName = launcherName;


    try {
        Runtime.getRuntime().exec( getDir() );
    } catch (IOException e) {
        System.out.println("Dir is invalid");
        e.printStackTrace();
    }

        hasLaunched = true;
        System.out.println(launcherName +" has launched!");

}//end of launchEXE


}

回答1:


It is likely that the programs have an expectation about their execution context.

From your example, it's likely that every program is being started within the same context/execution location that you run your program from, meaning that they can't find libraries or resources that they need.

Instead of using Runtime#exec directly, try using ProcessBuilder instead. This will allow you to change the execution location of the process.

For example...

String cmd = getDir();
File cmdFile = new File(cmd);
// Maybe check that the cmdFile.exists...;)
File parentFile = cmdFile.getParentFile();

ProcessBuilder pb = new ProcessBuilder(cmd);
pb.directory(parentFile);
pb.redirectError();

Process p = pb.start();

It would also be advisable to read the process's InputStream as some process get upset when you don't ;)

InputStream is = p.getInputStream();
// This simple reads the contents from the InputStream and discards it
// You could change it to actually dump the output if wanted ;)
while (is.read() != -1);

int exitValue = p.waitFor();


来源:https://stackoverflow.com/questions/18995821/runtime-getruntime-execpath-to-file-runs-but-program-acts-strange

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!