Java

I was having a problem where using Runtime.exec(String[]) would work fine, but using Runtime.exec(String[], String[]) would return the value -1073741515.

After a bit of digging, it turns out that the -1073741515 return value may mean STATUS_DLL_NOT_FOUND within Windows.

Using Process Monitor, I added a filter to check for the target .exe and found that it was failing to load cygwin1.dll:

The problem is that Runtime.exec(String[], String[]) does not copy over any existing environment variables, whereas Runtime.exec(String[]) does. You therefore have to copy existing environment variables yourself:

protected String[] getEnvironmentVariables() {
  List<String> envp = new ArrayList<String>();
  for (String key : System.getenv().keySet()) {
    envp.add(key + "=" + System.getenv(key));
  }

  // add your environment variable here
  envp.add("CYGWIN=nodosfilewarning");

  // return as a list of strings
  return envp.toArray(new String[]{});
}

(In this case, the PATH variable was not being provided, so it couldn’t find the cygwin1.dll anywhere.)