Runtime.getRuntime().exec( "path to file" ) 运行,但程序行为奇怪



我正在为许多程序制作一个基于文本的启动器。我正在使用 Runtime.getRuntime().exec("path//to//file.exe"))方法。

该程序将运行,它总是会,但有些行为很奇怪或找不到那里的关键.dll文件。其他人在运行时文本搞砸了等。如您所见,这些都是复杂的游戏,并且使用了许多我不了解的引擎。谢谢!

死亡空间3:屏幕是黑色的,虽然游戏正在运行。仅显示似乎不起作用

MW3:TeknoMW3.exe找不到teknomw3.dll即使它们在同一个文件夹中(启动它通常会使其运行良好(。

无尽空间:文本显示奇怪。退出是 %getuserexit% 或类似于应该和正常显示文本的每个空间。仅在主菜单上出现。

细胞分裂列表:目录正确,找不到指定的文件。病态的突出工作围绕那个。

生化奇兵1:直接崩溃(可能是由于.dll问题,我实际上不知道(

生化奇兵 2:从不运行。 文件已执行但不运行。

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

}

程序很可能对其执行上下文有期望。

从您的示例中,每个程序很可能都在运行程序的同一上下文/执行位置启动,这意味着它们找不到所需的库或资源。

不要直接使用 Runtime#exec,而是尝试改用ProcessBuilder。 这将允许您更改进程的执行位置。

例如。。。

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();

还建议阅读该过程的InputStream,因为当您不;)时,某些过程会感到不安

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();

相关内容

最新更新