如何在Windows中创建一个子进程,使其拥有与父进程相同的环境变量以及自己独有的变量?

4
在 Windows 中,创建新的子进程时我使用 CreateProcess 函数:
BOOL WINAPI CreateProcess(
  __in_opt     LPCTSTR lpApplicationName,
  __inout_opt  LPTSTR lpCommandLine,
  __in_opt     LPSECURITY_ATTRIBUTES lpProcessAttributes,
  __in_opt     LPSECURITY_ATTRIBUTES lpThreadAttributes,
  __in         BOOL bInheritHandles,
  __in         DWORD dwCreationFlags,
  __in_opt     LPVOID lpEnvironment,
  __in_opt     LPCTSTR lpCurrentDirectory,
  __in         LPSTARTUPINFO lpStartupInfo,
  __out        LPPROCESS_INFORMATION lpProcessInformation
);

在这里,我们可以看到CreateProcess可以获取lpEnvironment参数来指定新进程的环境变量,如果它为NULL,则子进程将具有与父进程相同的环境。现在我希望子进程具有与父进程相同的环境加上在lpEnvironment中指定的环境变量(即父进程和指定变量的合并环境)。您建议如何做到这一点?我应该获取父进程的所有环境变量,将它们与新的变量合并,并将它们全部传递给CreateProcess吗?
2个回答

4
我认为你走在正确的道路上。获取现有的环境块,添加新内容,将其传递给CreateProcess函数,然后销毁新的环境块。
要获取当前块,请使用GetEnvironmentStrings。添加新变量可能需要进行简单的字符串操作。环境块只是一系列以空字符结尾的字符串,最后以双重空字符结束,如此处所述。如果已经定义了变量,您可能需要先检查是否正在附加新的环境变量或更新现有的环境变量。

0
使用 getenv 获取当前环境变量,并添加自己的环境变量并设置。

但是如果我不知道实际上有哪些环境变量存在,我该如何使用getenv()函数呢? - Mihran Hovsepyan
如果在环境表中未找到varname,则返回值为NULL。如果您对特定值感兴趣,请进行标记化并比较。 - cprogrammer
我对获取所有环境变量很感兴趣。在这种情况下,我认为getenv不能帮助我。 - Mihran Hovsepyan
2
GetEnvironmentStrings 应该会有所帮助(http://msdn.microsoft.com/zh-cn/library/ms683187(v=vs.85).aspx)。请阅读备注。 - cprogrammer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接