1

我正在尝试通过拖放将电子邮件从 Outlook 传输到 Eclipse RCP 应用程序。使用此代码片段,我发现在从 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 "";
    }
4

1 回答 1

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 字符串)。

于 2012-10-23T22:35:12.820 回答