繁体   English   中英

JNA Java CredUIPromptForWindowsCredentialsW

[英]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声明为PointerPointerByReference

函数CredUIPromptForWindowsCredentialsW返回代码160(“错误参数”)。这是什么问题?

因为Java在“按值”和“按引用”之间没有区别,所以JNA会根据最常见的用法模式来推断它应用于给定的Structure用法。

在这种情况下,本机PCREDUI_INFO表示struct* ,这是struct作为函数参数的更常见用法。 JNA将默认使用您的Structure的已分配内存的地址作为本机参数,并在本机调用之前和之后自动将Structure的Java字段与本机内存同步。

如果传递Structure.getPointer() ,则将不会执行任何同步,并且您的本机代码将获得具有未定义内容的内存块(因此会出现“错误参数”错误)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM