2011-04-08 36 views
3

在窗口创建新的子proccess我使用CreateProcess功能:如何让子进程使用与parrent相同的环境变量加上它自己的windows?

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,孩子就会有相同环境作为parrent。现在,我希望孩子拥有与lpEnvironment(即父进程和指定进程的合并环境)中指定的parrent plus环境变量相同的环境。你会如何建议这样做?我应该把父母的所有envs合并为新的,并将它们全部传递给CreateProcess

+0

是的,你应该。 – harper 2011-04-08 06:18:05

回答

0

使用getenv让CRT ENV添加自己并设置

+0

但是我怎么能使用getenv()如果我不知道什么样的envs实际上存在? – 2011-04-08 06:28:38

+0

如果在环境表中找不到varname,则返回值为NULL。如果您对某个特定值感兴趣,请将其标记并比较 – cprogrammer 2011-04-08 06:34:28

+0

我有兴趣获得所有的envs。在这种情况下,我不认为getenv会帮助我。 – 2011-04-08 06:37:46

3

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

要获取当前块使用GetEnvironmentStrings。通过简单的字符串操作可能需要添加新的变量。环境块仅仅是空尾字符串的连续序列,结尾处为双空字符,如here所述。如果您正在附加新的env变量或更新现有变量,则可能需要先检查它是否已经定义。

相关问题