Java调用rundll32启动Windows照片查看器参数异常问题
解决Java调用Windows照片查看器时的Exec异常问题
嘿,我一眼就看出你踩了个Java执行外部命令时的经典参数拆分坑!问题出在你用String[]传递参数的方式上——数组里的每个参数不需要额外加双引号,因为数组本身就把每个元素标记成独立参数了,你加的引号会被当成参数的一部分,导致rundll32找不到正确的DLL文件。
先看你原来的params数组:
String[] params = new String[] {"C:\\WINDOWS\\System32\\rundll32.exe", "\"C:\\Program Files\\Windows Photo Viewer\\PhotoViewer.dll\", ImageView_Fullscreen", "c:\\temp\\foo.png"};
这里第二个参数把DLL路径和ImageView_Fullscreen用逗号连在一起,还加了引号,这完全不对。rundll32的正确参数格式是:rundll32.exe <DLL路径> <导出函数名> <参数>,所以这三个部分要拆成独立的数组元素,而且路径不需要引号。
正确的参数数组写法
String[] params = new String[] { "C:\\WINDOWS\\System32\\rundll32.exe", "C:\\Program Files\\Windows Photo Viewer\\PhotoViewer.dll", "ImageView_Fullscreen", "c:\\temp\\foo.png" };
为什么原来的写法会报错?
当你用单个字符串执行命令时,系统的命令行解析器会处理双引号,把带空格的路径识别成一个整体;但用String[]传递参数时,Java会直接把每个数组元素传给目标进程,每个元素就是一个独立的参数。你原来的第二个参数会被rundll32当成一个完整的文件名,它会尝试找一个叫"C:\Program Files\Windows Photo Viewer\PhotoViewer.dll", ImageView_Fullscreen的文件,这显然不存在,自然就抛出异常了。
用Commons Exec更稳妥的写法
既然你用的是Commons Exec,推荐用它的CommandLine类来构建命令,它会自动处理参数的转义和拆分,不用手动纠结引号问题:
CommandLine cmdLine = new CommandLine("C:\\WINDOWS\\System32\\rundll32.exe"); cmdLine.addArgument("C:\\Program Files\\Windows Photo Viewer\\PhotoViewer.dll"); cmdLine.addArgument("ImageView_Fullscreen"); cmdLine.addArgument("c:\\temp\\foo.png"); DefaultExecutor executor = new DefaultExecutor(); try { executor.execute(cmdLine); } catch (IOException e) { e.printStackTrace(); }
这样调整后,应该就能正常启动Windows照片查看器打开指定图片了。
内容的提问来源于stack exchange,提问作者Nicklas Karlsson
相关产品推荐
相关产品推荐

