3

Direct2D クラス ID2DFactory からマップされた関数を取得しようとしていましたが、この前の質問を使用して移植できました。

私が考えた次のステップは、 を使用Function.getFunction(して関数を取得し、を使用して機能function.invokeXXX()するメソッドを作成することでした。

今、これは私が思っていたよりも難しいようです。以下のコードは、私が目標を達成しようとしたものです。

    D2D1_FACTORY_OPTIONS opts = new D2D1_FACTORY_OPTIONS();
    PointerByReference pp = new PointerByReference();
    HRESULT hres = D2D1.INSTANCE.D2D1CreateFactory(0, new REFIID(new IID("06152247-6F50-465A-9245-118BFD3B6007").toByteArray()), opts, pp);
    //hres returns 0 which means it was successful.

    // I thought that, since pp is a reference to a reference to the Factory, 
    // that getValue().getPointer(0) would give me the Factory, and thus the
    // first Pointer 'ReloadSystemMetrics()'.
    Function fnc = Function.getFunction(pp.getValue().getPointer(0).getPointer(0), Function.ALT_CONVENTION);
    fnc.invokeInt(null); // I have aswell tried new Object[] {}. This does not throw an error.

    //This is (or should be) GetDesktopDpi(Float*, Float*).
    Function fncGetdpi = Function.getFunction(pp.getValue().getPointer(0).getPointer(1), Function.ALT_CONVENTION); 
    FloatByReference x, y;
    x = y = new FloatByReference();
    fncGetdpi.invokeVoid(new Object[] {x, y}); //But this gives 'Invalid memory access'

私は自分が望んでいたことを達成するのにまだ運がありません. うまくいけば、誰かが私が間違っていることについて私の洞察を与えることができます:)

4

0 に答える 0