Win32 函数 DwmGetColorizationColor 的 JNA 绑定返回 E_INVALIDARG 错误

问题描述 投票:0回答:1

我正在尝试使用 JNA 为 Win32 函数 DwmGetColorizationColor 创建绑定。

根据MSDN,这是函数签名:

HRESULT DwmGetColorizationColor(
    [out] DWORD *pcrColorization,
    [out] BOOL  *pfOpaqueBlend
);

这是我创建的绑定:

WinNT.HRESULT DwmGetColorizationColor(
    WinDef.DWORD pcrColorization,
    WinDef.Bool pfOpaqueBlend
);

这就是我调用此方法的方式:

var pcrColorization = new WinDef.DWORD();
var pfOpaqueBlend = new WinDef.BOOL();

var result = CLibrary.INSTANCE.DwnGetColorizationColor(
                pcrColorization,
                pfOpaqueBlend
             );

if (!result.equals(S_OK)) {
    System.out.println(result);
    System.out.println(Kernel32.INSTANCE.GetLastError());
}

此问题的问题是结果为非零,值为 E_INVALIDARG 并且

GetLastError()
的输出为 127 (ERROR_PROC_NOT_FOUND)

我在创建 C/C++ 或为其创建绑定方面的经验为零。但这看起来相当简单。

那么我做错了什么?

java windows winapi java-native-interface jna
1个回答
0
投票

函数签名是指针:

HRESULT DwmGetColorizationColor(
    [out] DWORD *pcrColorization,
    [out] BOOL  *pfOpaqueBlend
);

所以你不需要

DWORD
BOOL
,你需要
DWORD *
BOOL *
,指向存储在其他地方的实际值的指针。

来自

WinDef
类的最直接映射是
DWORDByReference
BOOLByReference
:

WinNT.HRESULT DwmGetColorizationColor(
    WinDef.DWORDByReference pcrColorization,
    WinDef.BOOLByReference pfOpaqueBlend
);

由于

DWORD
只是 32 位
int
,因此如果您选择使用
IntByReference
进行映射会更方便,从而省去将
int
包装成
DWORD
的麻烦。构建
DWORDByReference
。不幸的是,没有类似的布尔引用快捷方式,因为位宽取决于操作系统。

© www.soinside.com 2019 - 2024. All rights reserved.