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

yi0zb3m4  于 2023-11-21  发布在  Windows
关注(0)|答案(1)|浏览(117)

我正在尝试使用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_INVALIDARGGetLastError()的输出为127(ERROR_PROC_NOT_FOUND)
我没有创建C/C++或为其创建绑定的经验,但这看起来相当简单。
我做错了什么?

olmpazwi

olmpazwi1#

函数签名是指针:

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

字符串
所以你不需要DWORDBOOL,你需要一个DWORD *BOOL *,指向存储在其他地方的实际值的指针。
WinDef类的最直接Map是DWORDByReferenceBOOLByReference

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


调用函数后,可以对这些变量使用.getValue()来提取返回值。
由于DWORD只是一个32位int,如果您选择,使用IntByReference进行Map会更方便,来保存你在构造DWORDByReference时将int Package 成DWORD,在获取返回值时 Package 成额外的intValue()的麻烦。引用,因为位宽取决于操作系统。

相关问题