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);