ENVIRONMENT VARIABLE : 윈도우즈에서 환경변수 설정 방법 윈도우




환경변수는 프로세스에서 사용하는 변수 블록이다. 파일의 경로를 찾거나, 임시파일을 위한 디렉토리 경로나, 프로그램의 특정 옵션 혹은 기타 정보들을 유지하기 위해서 시스템은 환경 변수 값을 유지 한다. 시스템은 각 유저별로 환경변수를 유지하며 이 값은 프로세스별로 독립적이며 공유되지 않는다.  

프로세스가 시작되면 프로세스는 윈도우 레지스트리

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control 
\ Session Manager \ Environment

로 부터 환경변수 값을 복사해 와 세팅한다. 






이런 이유에서 프로세스가 시작할때의 환경 변수는 같을 수 있지만 실행 도중 추가되는 환경 변수로 인해 서로 다른 프로세스의 환경 변수는 서로 다를 수 있다. 환경 변수를 추가하는 방법은, 커맨드 라인에서 SET 명령어를 이용하거나 제어판 \ 시스템 \ 고급 \ 환경변수 에서 설정할 수 있다.



이미 언급 했듯이 서로 다른 프로세스의 환경 변수는 다를 수 있다. 프로세스가 윈도우에 의해 생성되는 것이 아니라 부모 프로세스로부터 CreateProces 로 생성되는 경우는 레지스트리로 부터 값을 얻어오는 것이 아니라 부모 프로세스의 환경 변수를 상속 받는다.

CreateProcessMSDN 설명을 확인 해 보자.



옵션중, LPVOID lpEnvironment 인자가 존재한다. 설명을 보면,


" 인자값이 NULL 일때는 생성된 자식 프로세스는 부모 프로세스의 환경 변수 블록을 상속 받는다. "   라고 설명 되어 있다.




자, 그렇다면 이런 환경변수를 어떤 함수를 이용해 변경 할 수 있는가? 두가지 방법이 있다. 

하나는 CRT, 즉 C Runtime Library 함수를 사용하는 것.


- _getenv()
- _putenv()


두번째는 윈도우즈에서 제공하는 API 를 사용하는 것.


- GetEnvironmentVariable
- SetEnvironmentVariable
- GetEnvironmentStrings
- SetEnvironmentStrings


하지만 이러한 방법은 '해당 프로세스'의 환경 변수를 변경 할 뿐이다. 프로세스가 종료되면 프로세스가 가지고 있던  환경 블록도없어진다. 모든 프로세스에게 영향을 주려면, 프로세스가 얻어오는 '시스템'의 환경 변수를 변경해야 한다. 


HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control 
\ Session Manager \ Environment

를 변경하고 모든 프로세스가 해당 레지스트리를 다시 얻어 올 수 있도록 WM_SETTINGCHANGE 타입으로 LPARAM 에 "Environment" 문자열을 세팅한 뒤 브로드 캐스팅 메세지를 보내면 된다. 아래는 MSDN 의 설명이다.




SendMessage ( HWND_BROADCAST, WM_SETTINGCHANGE, 0, (LPARAM)TEXT("Environment") );

덧글

  • 우왕굳 2014/02/20 11:20 # 삭제 답글

    찾고있던 자료인데 감사합니다~!
댓글 입력 영역


시계

라운드 시계

위키피디아