【问题标题】:Calling GetOpenFileName through JNA fails for Swing appSwing 应用程序通过 JNA 调用 GetOpenFileName 失败
【发布时间】:2011-10-11 16:32:22
【问题描述】:

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

 public static List<File> 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<File> 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<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);
            }
        });
    }
}

对于后一个示例,CommDlgExtendedError 返回 2,according to MSDN 是:

CDERR_INITIALIZATION 0x0002

普通对话框函数在初始化过程中失败。当没有足够的内存可用时,通常会发生此错误。

...这对我帮助不大。我在这里做错了什么?


我已将其他来源放在 PasteBin 上,因此我不会过多地混淆问题:

OpenFileDialog:http://pastebin.com/HDmu0TjX

ComDlg32JNA:http://pastebin.com/X5F5LLip

【问题讨论】:

  • 这可能是一个 SWAG,但是如果您在使用之前通过调用 buffer.clear(); 清除 ByteBuffer 会怎样?
  • 很遗憾,这并没有什么不同。

标签: java winapi swing jna comdlg32


【解决方案1】:

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

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

【讨论】:

  • 感谢您的建议,但在后台线程中执行此操作也无济于事。 :-( 有趣的是你没有 DLL,因为我也运行 Win 7 64 并且我有它。
  • @perp:你用的是什么版本的 jna?当我使用 3.3.0 运行您的代码时,它会引发 UnsatisfiedLinkException。但它适用于 3.2.7,事件 Swing 测试。
  • 我似乎无法使其适用于任何一个版本。我还尝试了 32 位和 64 位 JVM。接下来我会尝试直接映射,甚至可能会跳过JNA直接使用JNI,只是为了看看问题出在哪里。
  • @perp:你可能想在 jni 之前尝试一下这个库:code.google.com/p/bridj
猜你喜欢
  • 1970-01-01
  • 2021-03-23
  • 1970-01-01
  • 1970-01-01
  • 2010-10-09
  • 2018-12-18
  • 1970-01-01
  • 2016-09-12
  • 1970-01-01
相关资源
最近更新 更多