1

OutlookからEclipseRCPアプリケーションにドラッグアンドドロップでメールを転送しようとしています。このコードスニペットを使用して、Outlook2010からJavaへのドラッグアンドドロップ操作中に次のネイティブタイプが転送されることがわかりました。

ここに画像の説明を入力してください

メッセージ本文全体が必要なため、ドラッグアンドドロップ操作中に提供されたテキストでは不十分です。ネイティブオブジェクトをJavaオブジェクトに変換するために、ByteArrayTransferを拡張しようとしました。これにより、電子メールへのアクセスが提供されます。FileGroupDescriptorのような構造体は、ネイティブC構造体です。JNAを使用してそれらを読み出そうとしましたが、JNAはC構造体をStructureクラスのオブジェクトに変換できません。

2つの質問があります:

  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 に答える