Ошибка неверного параметра при использовании NetShareAdd windows Api с использованием библиотеки JNA - PullRequest
1 голос
/ 08 января 2020

Я пытаюсь использовать NetShareAdd Windows API в моем java коде с использованием библиотеки JNA - 5.5.0, JNA Platform -5.5.0 , на Windows 10 машин, использующих 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

Я проверил, используя net share testfolder=e:\testfolder в Windows командной строке, и он работает. Я также протестировал Windows API NetShareAdd непосредственно в cpp программе, и она также работает. Но я не могу заставить эту функцию работать с библиотекой JNA. Я использовал другие функции JNA в отношении сетей, но они работают нормально. Пожалуйста, помогите мне найти ошибку.

1 Ответ

1 голос
/ 08 января 2020

Вы заполнили поля класса Java для своей структуры SHARE_INFO_2 после ее создания, но вы не записали новые поля в собственную память до использования структуры, поэтому собственная функция видит нулевые указатели и начальные значения созданной структуры.

Когда при отображении метода используется класс Structure, эта запись java в нативную выполняется автоматически. В этом случае, однако, метод NetShareAdd() ожидает Pointer (поскольку существует несколько различных классов, которые можно использовать). JNA не знает, откуда появился указатель или насколько велик буфер, и т. Д. c., Поэтому он не может автоматически копировать память на исходную сторону после того, как вы внесли изменения java.

Добавление shi.write() после установки всех значений Java на стороне shi скопирует эти данные в собственную память, а ваш буфер будет содержать данные и указатели, которые ожидает метод.

...