我正在尝试使用 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++ 或为其创建绑定方面的经验为零。但这看起来相当简单。
那么我做错了什么?
函数签名是指针:
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
。不幸的是,没有类似的布尔引用快捷方式,因为位宽取决于操作系统。