[使用JNA库的NetShareAdd Windows Api使用无效参数错误

问题描述 投票:0回答:1

[我正在尝试在Windows 10计算机java 8中使用(NetShareAdd windows api)在Java代码中使用JNA library - 5.5.0,JNA Platform -5.5.0,并获得共享名无效的参数错误。我正在使用以下代码

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);
    }
}

output
errorcode:87
parameter:1


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

jna
1个回答
0
投票

您已经为SHARE_INFO_2结构填充了Java类字段,但在使用该结构之前尚未将它们写入本机内存。当function / method参数为Structure时,会自动发生这种情况,但是在这种情况下,由于存在多个结构选项,并且NetShareAdd()方法要求使用NetShareAdd(),因此您必须手动在内存上进行复制。

在设置Pointer的所有Java端值之后添加shi.write()会将该数据复制到本机内存,并且缓冲区将包含所需的数据,而不是空指针。

© www.soinside.com 2019 - 2024. All rights reserved.