答案 0 :(得分:6)
请注意,在CreateProcess
函数的声明中,声明lpEnvironment
参数为LPVOID
。
这是什么意思?这意味着您可以使用Ansi / Unicode版本的CreateProcess
函数,并以任意组合传递它的Ansi / Unicode版本环境块。特别是,您可以使用CreateProcess
的Unicode版本并将其传递给Ansi环境块,反之亦然。
如果您实际使用unicode环境块,那么设置CREATE_UNICODE_ENVIRONMENT
必需,因为没有其他传统的方式(除了一些丑陋的启发式方法)操作系统可能会发现它是unicode。
现在关于你的问题:
如果未明确传递环境块,则新创建的进程最初将具有与其创建者相同的环境变量。除非您需要对新创建的流程进行一些额外配置,否则只需要重新配置。
如果将环境块传递给新创建的进程 - 您必须手动构建它或从某个地方获取它。无论哪种方式,必须知道它是否为unicode。
新流程的父级是其创建者。在您的特定情况下 - 您的流程。
这完全取决于环境块的创建方式。如果你总是通过调用GetEnvironmentStrings
来传递你得到的东西 - 那么如果你用UNICODE
定义编译,那么它就是unicode。然后,如果您正在使用unicode进行编译,则应设置CREATE_UNICODE_ENVIRONMENT
。另一方面,如果您手动构建它 - 即使您没有在unicode中编译,也可以在unicode中构造它。因此 - 您应该根据构造环境块的方式设置CREATE_UNICODE_ENVIRONMENT
,而不是根据编译定义。
如上所述,CreateProcessA
和CreateProcessW
都可以使用Ansi或Unicode环境块。这完全是需要此标志的原因。