Win32 CreateProcess:什么时候需要CREATE_UNICODE_ENVIRONMENT *?

时间:2010-11-17 15:48:19

标签: windows winapi unicode createprocess

1 个答案:

答案 0 :(得分:6)

请注意,在CreateProcess函数的声明中,声明lpEnvironment参数为LPVOID

这是什么意思?这意味着您可以使用Ansi / Unicode版本的CreateProcess函数,并以任意组合传递它的Ansi / Unicode版本环境块。特别是,您可以使用CreateProcess的Unicode版本并将其传递给Ansi环境块,反之亦然。

如果您实际使用unicode环境块,那么设置CREATE_UNICODE_ENVIRONMENT 必需,因为没有其他传统的方式(除了一些丑陋的启发式方法)操作系统可能会发现它是unicode。

现在关于你的问题:

  1. 如果未明确传递环境块,则新创建的进程最初将具有与其创建者相同的环境变量。除非您需要对新创建的流程进行一些额外配置,否则只需要重新配置。

  2. 如果将环境块传递给新创建的进程 - 您必须手动构建它或从某个地方获取它。无论哪种方式,必须知道它是否为unicode。

  3. 新流程的父级是其创建者。在您的特定情况下 - 您的流程。

  4. 这完全取决于环境块的创建方式。如果你总是通过调用GetEnvironmentStrings来传递你得到的东西 - 那么如果你用UNICODE定义编译,那么它就是unicode。然后,如果您正在使用unicode进行编译,则应设置CREATE_UNICODE_ENVIRONMENT。另一方面,如果您手动构建它 - 即使您没有在unicode中编译,也可以在unicode中构造它。因此 - 您应该根据构造环境块的方式设置CREATE_UNICODE_ENVIRONMENT,而不是根据编译定义。

  5. 如上所述,CreateProcessACreateProcessW都可以使用Ansi或Unicode环境块。这完全是需要此标志的原因。