Как передать указатель среды в Windows CreateProcess в Java (используя jna) - PullRequest
0 голосов
/ 25 мая 2018

Я звоню 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 и не запустил команду.

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

1 Ответ

0 голосов
/ 25 мая 2018

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

...