problems with exec("rundll32.exe shell32.dll...")
Tue May 20 14:39:00 GMT 2003

>However, we had a good reason for doing this:
>(Also see the messages following it).
>I do not know why this behaviour changes for these
>programs - a simple test program in C that I wrote
>that merely prints out argv[] never manages to
>see the difference between quoted and unquoted
>command lines. :-(

hi Ranjit,

>The problem that you are reporting as well as that
>reported by Oywind can be traced to the fact that
>we put a double quote (") around every argument
>on a command line before calling Win32 CreateProcess( )

 I think this might not be the right thing to do?

Is the difference that

      exec(String s)

            parses s into an array of arguments using whitespace as the
delimiter* so

                  cmd /C dir c:\program files

            would be parsed (correctly) to
{"cmd","/C","dir","c:\program","files"}, and then make the dir fail?

If the user in java wants to execute this they should do this:

      exec(new String [] {"cmd","/C","dir","c:\\program files"});

(demonstrated in code included below)

Once you have the String [], I think only the entries containing whitespace
need to be quoted - this should then bring the behaviour of the JRE + gcj


*from the API
Executes the specified string command in a separate process.
      The command argument is parsed into tokens and then executed as a
      command in a separate process. The token parsing is done by a
      StringTokenizer created by the call:
             new StringTokenizer(command)

      with no further modifications of the character categories. This
      method has exactly the same effect as exec(command, null).


import java.util.*;

public class GCJTest2 {
   public static void main(String [] arg) throws Exception {
      System.out.println("Using String[] gives ");
      Process a = Runtime.getRuntime().exec(new String []
{"cmd","/C","dir","C:/Program Files"});
      new Thread(new Threader(a.getInputStream(),"(out)")).start();
      new Thread(new Threader(a.getErrorStream(),"(err)")).start();
      System.out.println("String[] exit value: "+a.exitValue());

      System.out.println("\n\nUsing String gives ");
      Process b = Runtime.getRuntime().exec("cmd /C dir C:/Program Files");
      new Thread(new Threader(b.getInputStream(),"(out)")).start();
      new Thread(new Threader(b.getErrorStream(),"(err)")).start();
      System.out.println("String exit value: "+b.exitValue());

   static class Threader implements Runnable {
      BufferedReader br;
      String ss;

      Threader(InputStream is, String s) {
         br = new BufferedReader(new InputStreamReader(is));

      public void run() {
            for(String line; (line=br.readLine())!=null; ){
               System.out.println("\t "+ss+" "+line);
         }catch(Exception e){e.printStackTrace();}

More information about the Java mailing list