0

DLLD2D1.dllから関数D2D1CreateFactoryをマップしようとしていました。そこから、Direct2D Javaマッピングの作成を積み上げたいと思いますが、それはトピックから外れています。私はこれまでこれを持っていました:

public WinNT.HRESULT D2D1CreateFactory(int factoryType, REFIID riid, ID2D1Factory.ByReference ppIFactory);

ID2D1Factoryは次のようになります。

public class ID2D1Factory extends IUnknown {

    public ID2D1Factory() { }

    public ID2D1Factory(Pointer pvInstance) {
        super(pvInstance);
    }

}

以下のコードを使用してコードを実行しようとすると、「java.lang.Error:Invalid memory access」がスローされます(JNA.setProtected()をオンにした場合)。

実行するコード:

ID2D1Factory.ByReference ref= new ID2D1Factory.ByReference();
D2D1.INSTANCE.D2D1CreateFactory(0, new REFIID(new IID("06152247-6f50-465a-9245-118bfd3b6007").toByteArray()), ref);

理由がわかりません。私が間違っていることはありますか?

編集: technomageのおかげで、正しいメソッド宣言を取得することができました。メソッドは次のように宣言する必要があります。

public WinNT.HRESULT D2D1CreateFactory(int factoryType, REFIID riid, D2D1_FACTORY_OPTIONS opts, PointerByReference pref);

D2D1_FACTORY_OPTIONS構造は、次のようにマップされました。

public static class D2D1_FACTORY_OPTIONS extends Structure {
    public int debugLevel;
    protected List<String> getFieldOrder() {
        return Arrays.asList(new String[] { "debugLevel" });
    }
    public D2D1_FACTORY_OPTIONS() {}
    public D2D1_FACTORY_OPTIONS(int size) {
        super(new Memory(size));
    }
    public D2D1_FACTORY_OPTIONS(Pointer memory) {
        super(memory);
        read();
    }
}

最後に、メソッドを呼び出すためのスニペット:

D2D1_FACTORY_OPTIONS opts = new D2D1_FACTORY_OPTIONS();
PointerByReference pp = new PointerByReference();
D2D1.INSTANCE.D2D1CreateFactory(0, new REFIID(new IID("06152247-6f50-465a-9245-118bfd3b6007").toByteArray()), opts, pp);
4

1 に答える 1

2

このリファレンスによると、D2D1CreateFactoryは3番目と4番目の引数としてポインタ型を必要とします(3つの引数のみを宣言しています)。

オプションポインタ(単純)を挿入すると仮定すると、関数は指定したアドレスにポインタ値を「返す」ため、 struct *最後の引数はである必要があります。PointerByReference

次に、を使用PointerByReference.getValue()して新しいID2D1Factoryインスタンスを初期化できます(この場合、明示的に定義されていない限りStructure.ByReference、デフォルトでは関数パラメーターとしてのすべての構造がJNAによって扱われるため不要です)。struct *

public WinNT.HRESULT D2D1CreateFactory(int factoryType, REFIID riid, D2D1_FACTORY_OPTIONS options, ID2D1Factory ppIFactory);

public class D2D1_FACTORY_OPTIONS extends Structure { ... }

D2D1_FACTORY_OPTIONS options = ...;
PointerByReference pref = new PointerByReference();

D2D1.INSTANCE.D2D1CreateFactory(0, new REFIID(...), options, pref);
ID2D1Factory factory = new ID2D1Factory(pref.getValue());

Structure.read()そして、あなたのID2D1Factory(Pointer)ctorに電話することを忘れないでください。

于 2013-03-25T18:20:20.413 に答える