每个进程都有一个环境块。环境块由以null结尾的空字符串的块组成(意味着块末尾有两个空字节),其中每个字符串的格式如下:
【名称】=【值】
环境块中的所有字符串必须按名称按字母顺序排序。因为等号是分隔符,所以不能在环境变量的名称中使用。
默认情况下,子进程继承父进程的环境块的副本。以下示例演示如何创建一个传递给子进程的新环境块。
LPTSTR lpszCurrentVariable;
BOOL fSuccess;
//将环境字符串复制到环境块中。
lpszCurrentVariable = tchNewEnv;
if (lstrcpy(lpszCurrentVariable, "OperatingSystem=Windows") == NULL)
ErrorExit("lstrcpy failed");
lpszCurrentVariable += lstrlen(lpszCurrentVariable) + 1;
if (lstrcpy(lpszCurrentVariable, "API=Win32") == NULL)
ErrorExit("lstrcpy failed");
//使用NULL字节终止块。
lpszCurrentVariable += lstrlen(lpszCurrentVariable) + 1;
*lpszCurrentVariable = '\0';
//创建子进程,指定一个新的环境块。
fSuccess = CreateProcess(NULL, "childenv", NULL, NULL, TRUE, 0,
(LPVOID) tchNewEnv, //新的环境块
NULL, &siStartInfo, &piProcInfo);
如果(!fSuccess)
ErrorExit("CreateProcess failed");
如果您希望子进程只继承几个更改的父进程的大部分环境,请保存当前值,对子进程继承进行更改,创建子进程,然后还原保存的值,如下所示。
LPTSTR lpszOldValue;
TCHAR tchBuf[BUFSIZE];
BOOL fSuccess;
// lpszOldValue获取当前值“varname”,如果为“varname”,则为NULL
//环境变量不存在。将“varname”设置为新值,
//创建子进程,然后使用SetEnvironmentVariable进行还原
//“varname”的原始值。如果lpszOldValue为NULL,则“varname”
//变量将被删除。
lpszOldValue = ((GetEnvironmentVariable("varname",
tchBuf, BUFSIZE) > 0) ? tchBuf : NULL);
//设置子进程继承的值。
if(!SetEnvironmentVariable(“varname”,“newvalue”))
ErrorExit("SetEnvironmentVariable failed");
//创建子进程。
fSuccess = CreateProcess(NULL, "childenv", NULL, NULL, TRUE, 0,
NULL, //继承父亲的环境
NULL, &siStartInfo, &piProcInfo);
如果(!fSuccess)
ErrorExit("CreateProcess failed");
//恢复父级的环境。
if(!SetEnvironmentVariable(“varname”,lpszOldValue))
ErrorExit("SetEnvironmentVariable failed");
从控制台进程获取的以下示例打印进程环境块的内容。
LPTSTR lpszVariable;
LPVOID lpvEnv;
//获取指向环境块的指针。
lpvEnv = GetEnvironmentStrings();
//变量字符串由NULL字节分隔,块为
//由NULL字节终止。
for (lpszVariable = (LPTSTR) lpvEnv; *lpszVariable; lpszVariable++)
{
而(* lpszVariable)
putchar(*lpszVariable++);
putchar('\n');
}