Недавно я обнаружил интересную проблему. При использовании SetEnvironmentVariable я могу использовать Process Explorer, чтобы получить вновь созданную переменную среды. Однако, когда сам процесс является 32-разрядным, а ОС - 64-разрядной, Process Explorer (по крайней мере v10 ~ последний v11.33) не может найти новые переменные. Если программа является родной 64-битной, то все работает нормально, также как и 32-битный процесс, работающий в 32-битной ОС.
Вызов API-интерфейса SetEnvironmentVariable должен быть успешным, поскольку возвращаемое значение равно TRUE, а вызов GetEnvironmentVariable возвращает правильное значение. Кроме того, если вы создаете дочерний процесс, вы можете обнаружить, что переменная была правильно установлена в новом процессе с помощью Process Explorer.
Нет, если это ограничение SysWOW64 или ошибка в Process Explorer. Кто-нибудь знает?
И есть ли способ правильно получить 32-битные переменные среды? (например, принудительно запустить Process Explorer в 32-битном режиме или некоторые другие инструменты)
Образец источника для воспроизведения:
#include <stdio.h>
#include <windows.h>
int main(int argc, char *argv[])
{
printf("setting variable... %s\n",
SetEnvironmentVariable("a_new_var", "1.0") ? "OK" : "FAILED");
printf("press anykey to continue...\n");
getchar();
// system(argv[0]); // uncomment to inspect the child process
return 0;
}