【问题标题】:How make child process with same environment variables as parrent plus it's own in windows?如何在 Windows 中使用与父进程相同的环境变量加上自己的子进程?
【发布时间】:2011-08-01 06:17:21
【问题描述】:

在创建新子进程的窗口中,我使用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

【问题讨论】:

    标签: c++ c winapi environment-variables


    【解决方案1】:

    我认为你是在正确的轨道上。获取现有的 env 块,添加新内容,将其传递给 CreateProcess 函数,然后销毁新的 env 块。

    要获取当前区块,请使用GetEnvironmentStrings。附加新变量可能必须通过简单的字符串操作来完成。环境块是简单的以 null 结尾的字符串的连续序列,末尾带有双 null,如 here 所述。您可能需要先检查是否要附加新的环境变量或更新现有的环境变量,以防它已经定义。

    【讨论】:

      【解决方案2】:

      使用getenv 获取crt env 添加你自己的并设置

      【讨论】:

      • 但是如果我不知道实际上存在哪些环境,我该如何使用 getenv() 呢?
      • 如果在环境表中找不到varname,则返回值为NULL。如果您对特定值感兴趣,请标记并比较
      • 我有兴趣获取所有环境。在这种情况下,我认为 getenv 不会帮助我。
      • GetEnvironmentStrings 应该会有所帮助 (msdn.microsoft.com/en-us/library/ms683187(v=vs.85).aspx)。阅读备注
      • 谢谢@cprogrammer 看来这就是我需要的:)
      猜你喜欢
      • 2016-07-14
      • 2018-09-08
      • 1970-01-01
      • 1970-01-01
      • 2021-01-30
      • 1970-01-01
      • 2014-07-13
      • 2014-01-24
      相关资源
      最近更新 更多