VC ++ не обнаруживает вновь созданную переменную env, используя GetEnvironmentVariable - PullRequest
1 голос
/ 26 июня 2009

Я использую функцию Win32 GetEnvironmentVariable, чтобы получить значение переменной, которую я только что создал.Я использую Windows XP и VC ++ 2005. Если я запускаю программу из Visual Studio, она не может найти новую переменную.Если я запускаю его из командной строки, он делает.Я перезапустил VC ++, но тот же результат.Я даже перезапустил все экземпляры Visual Studio, но проблема все та же.Это может быть решено, если я перезагружаю ПК, но мне любопытно, почему это так.Вот код, который я использую:

#define BUFSIZE 4096
#define VARNAME TEXT("MY_ENV_NAME")

int _tmain(int argc, _TCHAR* argv[])
{
    TCHAR chNewEnv[BUFSIZE];

    DWORD dwEnv = ::GetEnvironmentVariable(VARNAME, chNewEnv, BUFSIZE);
    if (dwEnv == 0)
    {
        DWORD dwErr = GetLastError();
        if(dwErr == ERROR_ENVVAR_NOT_FOUND)
        {
            printf("Environment variable does not exist.\n");
            return -1;
        }
    }
    else
    {
        printf(chNewEnv);
    }

    return 0;
}

Если я заменю MY_ENV_NAME чем-то, что должно существовать, например, TEMP, оно будет работать как положено.Есть идеи?Спасибо.

Ответы [ 4 ]

5 голосов
/ 26 июня 2009

Расширяя сказанное Андерсом и Мартином, переменные среды - это одна вещь, которая наследуется при запуске приложения. Новая программа в основном получает копию среды во время ее запуска . При отладке ваш exe-файл обычно запускается Visual Studio, поэтому ваше приложение будет иметь ту же среду, что и Visual Studio. Visual Studio, как правило, запускается проводником. Если вы измените переменные среды, перейдя в Свойства системы-> Дополнительно-> Переменные среды, вам придется перезапустить Visual Studio, чтобы увидеть изменения.

Если вам нужно увидеть переменные окружения, которые видит Visual Studio, вы можете (по крайней мере для VS2005 / 2008) перейти в Инструменты ...-> Параметры ...-> Проекты и решения-> Настройки проекта VC ++ и установить Показать среду в журнале «Да». Это выведет все переменные окружения в журнал сборки (Ctrl + клик по ссылке в выводе вашей сборки). Вы должны собрать эту информацию, но я знаю, что это лучший способ увидеть среду VS.

Если вам действительно нужно изменить переменные окружения, а затем запустить их, и вам сложно отладить, вы можете создать отладочную исполняемую программу и вызвать DebugBreak () где-то рядом, где вы хотите начать отладку. Затем вы можете установить свою среду, как вы хотите, запустить EXE из проводника или из командной строки. Затем (при условии, что у вас включена отладка JIT), вы получите всплывающее окно, когда ваш код попадет в вызов DebugBreak (), и вы сможете подключиться к нему с помощью VS и отлаживать его оттуда нормально.

3 голосов
/ 27 июня 2009

Все зависит от того, как вы установите переменную среды:

  • Если вы запустили set MY_ENV_NAME=val в командной строке, то вы установили MY_ENV_NAME для этого экземпляра cmd.exe и все дочерние процессы, которые он выполнит в будущем. Среда существующих дочерних процессов не изменяется.

    В этом случае выход из среды IDE Visual Studio и запуск из командной строки (не Explorer) должен привести к тому, что он и его дочерние процессы увидят новую переменную среды.

  • Если вы использовали панель управления «Система» или «Пользователи» или команду setx для установки MY_ENV_NAME, то вы установили MY_ENV_NAME постоянно, и она будет установлена ​​для всех процессов после перезагрузки компьютера. Кроме того, вы можете обнаружить, что некоторые процессы, такие как Explorer, сразу же принимают изменения переменных среды.

    Это работает, сохраняя новую переменную среды в реестре в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment или HKEY_CURRENT_USER\Environment, в зависимости от того, выбрали ли вы системную переменную среды или переменную среды для пользователя. Существующие процессы уведомляются о том, что произошла смена переменной среды путем трансляции сообщения WM_SETTINGCHANGE с lParam=="Environment". Это сообщение заставляет их перечитывать постоянные переменные среды из реестра, если они знают, как это сделать. KB104011 содержит более подробную информацию.

    В результате, если вы используете панель управления «Система» или «Пользователи» для установки новой переменной среды, выход из среды IDE Visual Studio и ее повторный запуск из Проводника (не из командной строки) должны привести к тому, что он и его дочерние процессы увидят новая переменная среды.

3 голосов
/ 26 июня 2009

Убедитесь, что вы перезапускаете приложение, прежде чем сможете прочитать переменную среды. То же самое происходит, если у вас открыто окно консоли и вы меняете переменные среды на Моем компьютере, они не отмечены ни в одном из существующих окон консоли. Вам нужно перезапустить их, чтобы получить копию новых переменных среды.

2 голосов
/ 29 июня 2009

Спасибо за все ответы. Как я уже упоминал в своем вопросе, я попытался перезапустить все, кроме перезагрузки ПК. Оказывается, поскольку моя переменная окружения была переменной SYSTEM, VS не распознает ее без перезагрузки ПК. Когда я переместил переменную env из SYSTEM в USER и перезапустил VS, она работала нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...