[英]JNA Java CredUIPromptForWindowsCredentialsW
我正在尝试将此函数转换为JNA:
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package com.mycode.winapi;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.NativeLong;
import com.sun.jna.Pointer;
import com.sun.jna.Structure;
import com.sun.jna.WString;
import com.sun.jna.platform.win32.Sspi;
import com.sun.jna.platform.win32.WinDef.HBITMAP;
import com.sun.jna.platform.win32.WinDef.HWND;
import com.sun.jna.platform.win32.WinDef.ULONG;
import com.sun.jna.platform.win32.WinDef.ULONGByReference;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.ptr.PointerByReference;
import java.util.Arrays;
import java.util.List;
/**
* Credui
* @author
*/
public interface Credui extends Library {
/**
* INSTANCE
*/
Credui INSTANCE = (Credui) Native.loadLibrary("Credui", Credui.class);
/**
* CredUIPromptForWindowsCredentialsW
* DWORD WINAPI CredUIPromptForWindowsCredentials(
* _In_opt_ PCREDUI_INFO pUiInfo,
* _In_ DWORD dwAuthError,
* _Inout_ ULONG *pulAuthPackage,
* _In_opt_ LPCVOID pvInAuthBuffer,
* _In_ ULONG ulInAuthBufferSize,
* _Out_ LPVOID *ppvOutAuthBuffer,
* _Out_ ULONG *pulOutAuthBufferSize,
* _Inout_opt_ BOOL *pfSave,
* _In_ DWORD dwFlags
* );
*
* @return
*/
int CredUIPromptForWindowsCredentialsW(
PointerByReference pUiInfo,
int dwAuthError,
ULONGByReference pulAuthPackage,
Pointer pvInAuthBuffer,
ULONG ulInAuthBufferSize,
PointerByReference ppvOutAuthBuffer,
ULONGByReference pulOutAuthBufferSize,
IntByReference pfSave,
int dwFlags
);
/**
* CREDUI_INFO
*
* typedef struct _CREDUI_INFO {
* DWORD cbSize;
* HWND hwndParent;
* PCTSTR pszMessageText;
* PCTSTR pszCaptionText;
* HBITMAP hbmBanner;
* } CREDUI_INFO, *PCREDUI_INFO;
*/
public static class CREDUI_INFO extends Structure {
public int cbSize;
public HWND hwndParent;
public WString pszMessageText;
public WString pszCaptionText;
public HBITMAP hbmBanner;
/**
* getFieldOrder
* @return
*/
@Override
protected List getFieldOrder() {
return Arrays.asList(new String[]{
"cbSize",
"hwndParent",
"pszMessageText",
"pszCaptionText",
"hbmBanner",
});
}
}
}
并致电:
Credui.CREDUI_INFO info = new Credui.CREDUI_INFO();
info.cbSize = info.size();
info.pszCaptionText = new WString(caption);
info.pszMessageText = new WString(message);
PointerByReference pinfo = new PointerByReference(info.getPointer());
WinDef.ULONGByReference authPackage = new WinDef.ULONGByReference();
PointerByReference outCredBuffer = new PointerByReference();
WinDef.ULONGByReference outCredSize = new WinDef.ULONGByReference();
IntByReference save = new IntByReference(0);
WinDef.ULONG ulInAuthBufferSize = new WinDef.ULONG(0);
int result = Credui.INSTANCE.CredUIPromptForWindowsCredentialsW(pinfo, 0, authPackage,
null, ulInAuthBufferSize, outCredBuffer, outCredSize, save, 0);
if( result == 0 ) {
}
我试图在pUiInfo
中将CredUIPromptForWindowsCredentialsW
声明为Pointer
或PointerByReference
。
函数CredUIPromptForWindowsCredentialsW
返回代码160(“错误参数”)。这是什么问题?
因为Java在“按值”和“按引用”之间没有区别,所以JNA会根据最常见的用法模式来推断它应用于给定的Structure
用法。
在这种情况下,本机PCREDUI_INFO
表示struct*
,这是struct作为函数参数的更常见用法。 JNA将默认使用您的Structure
的已分配内存的地址作为本机参数,并在本机调用之前和之后自动将Structure
的Java字段与本机内存同步。
如果仅传递Structure.getPointer()
,则将不会执行任何同步,并且您的本机代码将获得具有未定义内容的内存块(因此会出现“错误参数”错误)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.