更改环境变量

【勇芳软件工作室】汉化HomePreviousNext

每个进程都有一个环境块。环境块由以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');

}