java - 如何在 Java 中将环境指针传递给 Windows CreateProcess(使用 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 并且不启动命令。
我不明白我做错了什么。我应该检查可能暗示问题的日志文件吗?
解决方案
啊所以看起来在使用CREATE_UNICODE_ENVIRONMENT
时需要服用UTF-16LE
byte[]
。确保每个key=value
后跟两个空值 aka (byte) 0)
。最后再添加两个空字节。可以如上制作指针。
推荐阅读
- telegram-bot - 电报机器人 Python
- android - 使用 Kotlin 在 Recycler View 中显示 JSON 值
- php - call_user_func_array("shell_exec", ...) 在 php 中不起作用
- javascript - JavaScript Object.hasOwnProperty() 问题
- wordpress - 如何制作联系表格 7 自定义字段?
- laravel - Pusher/Laravel Echo 间歇性地停止在 Ionic 3.9.2 上工作
- vbscript - 保存并关闭特定 Excel
- python - 如何将异常转换为任务?
- javascript - Amcharts 如何将数据传递给 dataprovider
- javascript - 安装和实现反应本机设备信息时出错