使用 NetShareAdd windows Api 使用 JNA 库时出现无效参数错误

Invalid Parameter Error using NetShareAdd windows Api using JNA Library

我正在尝试在 Windows 10 机器上使用 NetShareAdd Windows API in my java code using JNA library - 5.5.0,JNA Platform -5.5.0,使用 Java 8。我收到共享名的无效参数错误。我正在使用以下代码:

import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.LMAccess;
import com.sun.jna.platform.win32.LMShare;
import com.sun.jna.platform.win32.Netapi32;
import com.sun.jna.ptr.IntByReference;

import java.io.File;

public class JNATest {

    public static void createLocalShare(File shareFolder)
    {
        TestwareLMShare.SHARE_INFO_2 shi = new TestwareLMShare.SHARE_INFO_2();
        shi.shi2_netname = shareFolder.getName();
        shi.shi2_type = LMShare.STYPE_DISKTREE;
        shi.shi2_remark = "";
        shi.shi2_permissions = LMAccess.ACCESS_ALL;
        shi.shi2_max_uses = -1;
        shi.shi2_current_uses = 0;
        shi.shi2_path = shareFolder.getAbsolutePath();
        shi.shi2_passwd = "";
        IntByReference parm_err=new IntByReference();
        Pointer pointer=shi.getPointer();
        int result= Netapi32.INSTANCE.NetShareAdd(null,2,shi.getPointer(),parm_err); // share folder in local system
        System.out.println("errorcode:"+result);//errorcode 87 -invalid parameter
        System.out.println("parameter:"+parm_err.getValue());// 1 - shi2_netname is invalid
    }
    public static void main(String args[])
    {
        File file=new File("e:\testfolder"); // folder present in local system
        createLocalShare(file);
    }
}

输出:

errorcode:87
parameter:1

我已经在 Windows 命令提示符下使用 net share testfolder=e:\testfolder 检查过它是否有效。我还在 cpp 程序中直接测试了 Windows API NetShareAdd,它也可以工作。但是我无法使相同的功能与 JNA 库一起使用。我使用了其他有关网络的 JNA 功能,但它们工作正常。请帮我找出错误。

您在实例化后为 SHARE_INFO_2 结构填充了 Java class 字段,但在使用该结构之前尚未将新字段写入本机内存,所以本机函数看到空指针和实例化结构的初始值。

当方法映射使用 Structure class 时,这种 java 到本机的写入是自动完成的。然而,在这种情况下,NetShareAdd() 方法需要一个 Pointer(因为可以使用多个不同的 classes)。 JNA 不知道指针来自哪里或缓冲区有多大等,因此在您进行 java 端更改后,它无法自动将内存复制到本机端。

在设置 shi 的所有 Java 侧值后添加 shi.write() 会将数据复制到本机内存,然后您的缓冲区将包含数据和指针期待。