Изменение переменных окружения

Каждый процесс имеет блок конфигурации, связанный с ним. Блок конфигурации состоит из блока строк с символом нуля в конце, завершающегося нулем (означающего, что имеются два нулевых байта в конце блока), где каждая строка находится в форме:

Имя=значение (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,

(LPVOID) tchNewEnv, // новый блок конфигурации

NULL, &siStartInfo, &piProcInfo);

if (! fSuccess)

ErrorExit("CreateProcess failed");

Если Вы хотите, чтобы дочерний процесс наследовал большую часть конфигурации родителя лишь с некоторыми изменениями, сохраните текущие значения, сделайте изменения для дочернего процесса, который наследует, создайте дочерний процесс, а затем восстановите сохраненные значения, как показано ниже.

LPTSTR lpszOldValue;

TCHAR tchBuf[BUFSIZE];

BOOL fSuccess;

// lpszOldValue получает текущее значение "varname", или NULL, если

// переменная окружения "varname" не существует. Установим в "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);

if (! 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++)

{

while (*lpszVariable)

putchar(*lpszVariable++);

putchar('\n');

}

 

Назад в оглавление темы
На главную страницу темы

Hosted by uCoz