【问题标题】:Drag Emails From Outlook to Java (with JNA)将电子邮件从 Outlook 拖到 Java(使用 JNA)
【发布时间】:2012-10-23 15:13:47
【问题描述】:

我正在尝试通过拖放将电子邮件从 Outlook 传输到 Eclipse RCP 应用程序。使用这个Code Snippet,我发现在从 Outlook 2010 到 Java 的拖放操作期间,会传输以下原生类型:

我需要完整的消息正文,因此在拖放操作期间提供的文本是不够的。我试图扩展 ByteArrayTransfer 以便将本机对象转换为 Java 对象,从而提供对电子邮件的访问。像 FileGroupDescriptor 这样的结构是原生的 C 结构。我尝试使用 JNA 将它们读出,但 JNA 无法将 C 结构转换为我的 Structure 类的对象。

我有两个问题:

  1. 我的 JNA 代码有什么问题?
  2. 有人知道在 Java 中读取原生拖放结构的更好方法吗?

扩展 ByteArrayTransfer 类的代码:

    public class FileGroupDescriptor extends Structure {
        public int cItems;
        public FileDescriptor[] fgd;

        public FileGroupDescriptor() {
            super();
        }

        public FileGroupDescriptor(Pointer pointer) {
            super(pointer);
        }
    }

    public Object nativeToJava(TransferData transferData) {
        if (transferData.type == 49478) {
            Native.setProtected(true);

            byte[] buffer = (byte[]) super.nativeToJava(transferData);

            Memory memory = new Memory(buffer.length);
            memory.write(0, buffer, 0, buffer.length - 1);

            Pointer p = memory.getPointer(0);
            FileGroupDescriptor groupDescriptor = new FileGroupDescriptor(p);

            System.out.println(groupDescriptor.cItems);
        }

        return "";
    }

【问题讨论】:

  • 我目前正在开发一个名为 eclipsemail 的 eclipse 插件。有兴趣吗?
  • 其实我不需要邮件客户端。我只想归档电子邮件。
  • 它可以显示电子邮件。 nictate
  • 它也能读出Windows OLE结构吗?
  • 我们正在使用一种叫做 OutlookDD 的东西。我不确定我的队友在哪里找到它(我不确定它是否免费,我们可能会为此付费),它允许我们将消息作为 MSG 文件拖入 Java,包括所有内容。包是 de.wim.outldd,但是查看源文件,没有明显的版权细节可以说明从哪里获取它...

标签: java eclipse outlook swt jna


【解决方案1】:

名义上,这就是您需要初始化 JNA 结构的方式。

public class FileGroupDescriptor extends Structure {
    public int cItems;
    public FileDescriptor[] fgd;

    public FileGroupDescriptor(Pointer pointer) {
        super(pointer);
        this.cItems = pointer.readInt(0);
        this.fgd = new FileDescriptor[this.cItems];
        this.read();
    }
}

这应该足以提供您在fgd 字段中查找的信息。您还应该将整个byte[] 长度写入内存;不知道为什么要省略最后一个字节(这不是 C 字符串)。

【讨论】:

  • 感谢您的评论。我现在正在用 C++ 实现整个过程。
猜你喜欢
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多