본문 바로가기

Coding Note

[winAPI] API 환경변수 가져오기

보통 %SYSTEMROOT% 또는 %USERPROFILE% 등은 레지스트리에 쓰이는 특정 경로에 대한 숏컷이다.

c:\Windows  의 경로가 %SYSTEMROOT%이고 %USERPROFILE% 은 운영체제버젼마다 살짝씩 다르다.
실제로 명령창이나 탐색창에서 풀 네임대신 숏컷을 쓰면 잘 된다.

그래서 난 당연히 코딩상에서도 쓰면 되는줄 알았다.
그런데 NT계열에선 이 환경변수가 자동으로 지정되있지 않다고한다. 
(정확히 NT계열이기 때문에 그런건진 잘 모르겠다.)

하지만 이런 경로들이 꼭 필요할 때가 있다.
철수랑 민수랑 USERPROFILE의 경로가 다르다고 두 사람을 위해서 서로다른 경로를 지정하는 프로그램을
만들 수는 없지않은가?

그래서 찾아보니 이런 환경변수를 얻어로는 API 함수가 있었다.

DWORD WINAPI GetEnvironmentVariable(
  __in_opt   LPCTSTR lpName,
  __out_opt  LPTSTR lpBuffer,
  __in       DWORD nSize
); //from msdn.com

lpName [in, optional]

The name of the environment variable.
환경변수의 이름 

lpBuffer [out, optional]

A pointer to a buffer that receives the contents of the specified environment variable as a null-terminated string. An environment variable has a maximum size limit of 32,767 characters, including the null-terminating character.
널 종료 문자열인 환경변수의 명세(자세한 값)를 담아둘 버퍼의 포인터. 환경변수는 최고사이즈로 널 종료 문자를 포함한 32,767개의 문자까지 가능하다. 

nSize [in]

The size of the buffer pointed to by the lpBuffer parameter, including the null-terminating character, in characters.
널종료문자를 포함한 파라미터 lpbuffer  가 가리키는 버퍼의 크기.

환경변수의 확인은 명령창에서 set 을 입력하면 나오는데, 그 값들을 얻어올 수 있단다. 
const unsigned int size=50;
TCHAR buf[size];
GetEnvironmentVariable("USERPROFILE", buf,size);

이렇게 사용하면, 버퍼 변수에 USERPROFILE의 전체경로가 들어오게된다.

찾아보니 이것 말고도 환경변수에 관한 API함수가 꽤 있었다.
레지스트리 다룰때 유용할듯 싶다.