我正在尝试使用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++或为其创建绑定的经验,但这看起来相当简单。
我做错了什么?
1条答案
按热度按时间olmpazwi1#
函数签名是指针:
字符串
所以你不需要
DWORD
和BOOL
,你需要一个DWORD *
和BOOL *
,指向存储在其他地方的实际值的指针。WinDef
类的最直接Map是DWORDByReference
和BOOLByReference
:型
调用函数后,可以对这些变量使用
.getValue()
来提取返回值。由于
DWORD
只是一个32位int
,如果您选择,使用IntByReference
进行Map会更方便,来保存你在构造DWORDByReference
时将int
Package 成DWORD
,在获取返回值时 Package 成额外的intValue()
的麻烦。引用,因为位宽取决于操作系统。