![](/img/trans.png)
[英]FTDI library platform differences between Mac and Windows when using JNA
[英]Invalid Parameter Error using NetShareAdd windows Api using JNA Library
我正在尝试在使用JNA 库 - 5.5.0,JNA Platform -5.5.0 的Java 代码中使用NetShareAdd Windows API ,在使用 Java 8 的 Windows 10 机器上。我收到共享名的无效参数错误。 我正在使用以下代码:
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 类字段,但是在使用该结构之前您还没有将新字段写入本机内存,因此本机函数会看到空指针和实例化结构的初始值。
当方法映射使用Structure
类时,这种从 java 到本机的写入是自动完成的。 然而,在这种情况下, NetShareAdd()
方法需要一个Pointer
(因为可以使用多个不同的类)。 JNA 不知道指针来自哪里或缓冲区有多大等,因此在您进行 java 端更改后,它无法自动将内存复制到本机端。
在设置shi
所有 Java 端值后添加shi.write()
将把该数据复制到本机内存,然后您的缓冲区将包含该方法期望的数据和指针。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.