Как передать указатель среды в Windows CreateProcess в Java (используя jna)

Я звоню Kernel32.Instance.CreateProcess, чтобы запустить отдельный процесс. Одна проблема, с которой я сталкиваюсь, - это попытка передать блок среды в CreateProcess каждый раз, когда я это делаю, процесс не запускается.

я впервые использовал

Advapi32Util.getEnvironmentBlock(environment)

чтобы создать блок, затем сделать указатель (нужен CreateProcess( я использовал:

public static Pointer asPointer(String string) {
    byte[] data;
    try {
        data = Native.toByteArray(string, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        throw new RuntimeException(e);
    }
    Pointer pointer = new Memory(data.length + 1);
    pointer.write(0, data, 0, data.length);
    pointer.setByte(data.length, (byte) 0);
    return pointer;
}

Это, я думаю, приводит к двойному нулю, необходимому в конце. На самом деле я установил CREATE_UNICODE_ENVIRONMENT, поэтому попытался добавить два дополнительных нуля в конец Memory. Это по-прежнему приводило к тому, что CreateProcess возвращал false и не запускал команду.

Я не понимаю, что я делаю неправильно. Должен ли я проверять файл журнала, который может указывать на проблему?


person Luke    schedule 25.05.2018    source источник


Ответы (1)


Ах Итак, кажется, что при использовании CREATE_UNICODE_ENVIRONMENT нужно взять UTF-16LE byte[]. Убедитесь, что за каждым key=value следуют два нуля, также известные как (byte) 0). Наконец, добавьте еще два нулевых байта. Указатель можно сделать, как указано выше.

person Luke    schedule 25.05.2018
comment
см. также заголовок stackoverflow.com/questions/50502023/ - person Luke; 25.05.2018