通过JNA调用GetOpenFileName对于Swing应用程序失败

我正在尝试使用Java中的本机Windows文件对话框,使用JNA调用comdlg32函数GetOpenFileName 。 我做了一个静态方法, OpenFileDialog.display看起来像这样:

  public static List display(Window parent, boolean allowMultiSelect) 

它应该返回所选文件,如果用户取消了对话框,则返回null。

我有两个简单的测试程序。 这个按预期工作:

 package nativedialogs; import java.io.File; import java.util.List; public class SimpleTest { public static void main(String[] args) { List files = OpenFileDialog.display(null, true); System.out.println(files); } } 

但是,这个不是:

 package nativedialogs; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.util.List; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.SwingUtilities; public class SwingTest { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); JButton button = new JButton("Open file dialog"); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { List files = OpenFileDialog.display(f, true); // These also fail: // List files = OpenFileDialog.display(f, false); // List files = OpenFileDialog.display(null, true); // List files = OpenFileDialog.display(null, false); System.out.println(files); } }); f.add(button); f.pack(); f.setVisible(true); } }); } } 

对于后一个示例, CommDlgExtendedError返回2, 根据MSDN ,它是:

CDERR_INITIALIZATION 0x0002

初始化期间,公共对话框function失败。 当没有足够的内存时,通常会发生此错误。

……这对我来说并没有那么大的帮助。 我在这做错了什么?


我把其他资源放在了PasteBin上,所以我不会过多地混淆这个问题:

OpenFileDialog : http : //pastebin.com/HDmu0TjX

ComDlg32JNA : http : //pastebin.com/X5F5LLip

最好不要从Swing EDT中执行任何JNA代码。 尝试使用SwingWorker在后台线程中运行该对话框。

我试着帮助更多,但我的Win 7 64位上没有comdlg32 🙁

Interesting Posts