启动关联的程序或显示另一个程序的“打开方式”对话框

Aub*_*bin 3 java windows rundll32 shell32.dll

在第七窗口中,以下命令显示一个对话框,然后终止而没有任何其他操作,为什么?

预期效果是启动关联程序Notepad++或至少启动Notepad

RUNDLL32.EXE SHELL32.DLL,OpenAs_RunDLL D:\doc\toto.txt
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

Har*_*ton 5

首先,请注意,这OpenAs_RunDLL是一个未记录的入口点,因此期望它起作用的唯一原因是,它在HKEY_CLASSES_ROOT注册表中作为Open With外壳动词的实现(至少在某些Windows版本中)出现。

这仅意味着可以期望它在由适当的shell函数调用时起作用。这并不意味着它将必然在任何任意上下文中工作。

在我的家用计算机(Windows Vista)OpenAs_RunDLLrundll32,通过“开始”菜单的“运行”对话框发出命令时可以通过工作方式调用(即,使用选定的应用程序打开指定的文件),可以使用键盘快捷键打开该对话框Windows+R

它并没有被出现的对话框中,但应用程序没有启动:在命令行控制台窗口发出时,和你描述的症状是相同的工作。这是完全合法的行为,因为您在非设计的上下文中使用了未记录的入口点。

由于不能保证OpenAs_RunDLL将来的Windows版本中都存在,因此结果很简单:不要使用它。请改用支持的SHOpenWithDialogAPI函数,或将ShellExecuteShellExecuteExopenas动词一起使用;后者可能特别有用,因为使用VBScript之类的脚本语言很容易做到


Aub*_*bin 4

解决方案很简单:cmde.exe start

下面是嵌入该命令的 Java 代码:

private void open( File file ) {
   try {
      final String cmd =
         String.format( "cmd.exe /C start %s", file.getAbsolutePath());
      Runtime.getRuntime().exec( cmd );
   }
   catch( final Throwable t ) {
      t.printStackTrace();
   }
}
Run Code Online (Sandbox Code Playgroud)

选择后.project,将显示以下对话框:

在此输入图像描述

当选择底部的单选按钮时,将显示以下对话框:

在此输入图像描述

这正是我想要的。

  • 对于已经具有关联应用程序的文件(例如原始示例中的文本文件),这将不起作用(即不会显示“打开方式”对话框)。 (3认同)