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

per*_*erp 6 java winapi swing jna comdlg32

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

 public static List<File> display(Window parent, boolean allowMultiSelect)
Run Code Online (Sandbox Code Playgroud)

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

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

package nativedialogs;

import java.io.File;
import java.util.List;

public class SimpleTest {

    public static void main(String[] args) {
        List<File> files = OpenFileDialog.display(null, true);
        System.out.println(files);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,这个不是:

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<File> files = OpenFileDialog.display(f, true);
                        // These also fail:
                        // List<File> files = OpenFileDialog.display(f, false);
                        // List<File> files = OpenFileDialog.display(null, true);
                        // List<File> files = OpenFileDialog.display(null, false);
                        System.out.println(files);
                    }
                });
                f.add(button);
                f.pack();
                f.setVisible(true);
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

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

CDERR_INITIALIZATION 0x0002

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

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


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

OpenFileDialog:http://pastebin.com/HDmu0TjX

ComDlg32JNA:http://pastebin.com/X5F5LLip

Den*_*kiy 1

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

我想提供更多帮助,但我的 Win 7 64 位上没有 comdlg32 :(