Изменение переменных окружения
Каждый процесс имеет блок конфигурации, связанный с ним. Блок конфигурации состоит из блока строк с символом нуля в конце, завершающегося нулем (означающего, что имеются два нулевых байта в конце блока), где каждая строка находится в форме:
Имя=значение (name=value)
Все строки в блоке конфигурации должны сортироваться в алфавитном порядке по имени. Сортировка делается без учета регистра, порядка Уникода, без привязки к национальному языку. Поскольку знак "=" - разделитель, он не должен быть использован в имени переменной окружения.
По умолчанию, дочерний процесс наследует копию блока конфигурации родительского процесса. Нижеследующий пример демонстрирует, как создать новый блок конфигурации, чтобы передать его в дочерний процесс.
LPTSTR lpszCurrentVariable;BOOL fSuccess; // Копируем строки конфигурации в блок конфигурации. lpszCurrentVariable = tchNewEnv; if (lstrcpy(lpszCurrentVariable, "MyVersion=2") == NULL) ErrorExit("lstrcpy failed"); lpszCurrentVariable += lstrlen(lpszCurrentVariable) + 1; if (lstrcpy(lpszCurrentVariable, "MySetting=A") == NULL) ErrorExit("lstrcpy failed"); // Завершаем работу блока байтом со значением ПУСТО (NULL). lpszCurrentVariable += lstrlen(lpszCurrentVariable) + 1; *lpszCurrentVariable = '\0'; // Создаем дочерний процесс, определяя новый блок конфигурации. fSuccess = CreateProcess(NULL, "childenv", NULL, NULL, TRUE, 0,
|
Если Вы хотите, чтобы дочерний процесс наследовал большую часть конфигурации родителя лишь с некоторыми изменениями, сохраните текущие значения, сделайте изменения для дочернего процесса, который наследует, создайте дочерний процесс, а затем восстановите сохраненные значения, как показано ниже.
LPTSTR lpszOldValue;TCHAR tchBuf[BUFSIZE]; BOOL fSuccess; // lpszOldValue получает текущее значение "varname", или NULL, если // переменная окружения "varname" не существует. Установим в "varname" новое // значение, создадим дочерний процесс, а затем для восстановления используем // SetEnvironmentVariable первоначального значения "varname". Если // lpszOldValue имеет значение ПУСТО (NULL),переменная "varname" должна быть // уничтожена. lpszOldValue = ((GetEnvironmentVariable("varname",
// Установим значение для дочернего процесса, которое наследуется. if (! SetEnvironmentVariable("varname", "newvalue")) ErrorExit("SetEnvironmentVariable failed"); // Создадим дочерний процесс. fSuccess = CreateProcess(NULL, "childenv", NULL, NULL, TRUE, 0,
// Восстановим конфигурацию родителя. (! SetEnvironmentVariable("varname", lpszOldValue)) ErrorExit("SetEnvironmentVariable failed"); Нижеследующий пример, берет из консольного процесса, печатает содержание блока конфигурации процесса. LPTSTR lpszVariable;LPVOID lpvEnv; // Получает указатель на блок конфигурации. lpvEnv = GetEnvironmentStrings(); // Строки переменных отделены байтом со значением ПУСТО (NULL), а блок // завершается байтом со значением ПУСТО (NULL) (lpszVariable = (LPTSTR) lpvEnv; *lpszVariable; lpszVariable++)
|