使用 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()
会将数据复制到本机内存,然后您的缓冲区将包含数据和指针期待。
我正在尝试在 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()
会将数据复制到本机内存,然后您的缓冲区将包含数据和指针期待。