이번에는 환경변수를 콘솔창에 나타내는 실습을 하겠습니다.
#include <stdio.h>
#include <tchar.h>
#include <Windows.h>
#include <strsafe.h>
#include <stdlib.h>
void GetEnv()
{
PTSTR pEnvBlock = GetEnvironmentStrings();
//환경블럭 내용을 가져와서 문자열 블럭으로 메모리에 생성 후 그 포인터를 반환
TCHAR szName[MAX_PATH];
TCHAR szValue[MAX_PATH];
PTSTR pszCurrent = pEnvBlock;
HRESULT hr = S_OK;
PCTSTR pszPos = NULL;
int current = 0;
ZeroMemory(szName, MAX_PATH); //메모리 0으로 초기화
ZeroMemory(szValue, MAX_PATH);
while (pszCurrent != NULL)
{
if (*pszCurrent != TEXT('='))
{
pszPos = _tcschr(pszCurrent, TEXT('=')); //TEMP = sgsggs, '=' 의 위치 가져오기
pszPos++;
size_t cbNameLength = (size_t)pszPos - (size_t)pszCurrent - sizeof(TCHAR); //이름의 길이
hr = StringCbCopyN(szName, MAX_PATH, pszCurrent, cbNameLength); //이름부분만 복사
if (FAILED(hr))
break;
hr = StringCbCopyN(szValue, MAX_PATH, pszPos, _tcslen(pszPos) + 1); //값부분만 복사
if (SUCCEEDED(hr))
_tprintf(TEXT("[%u] %s = %s\n"), current, szName, szValue);
else {
if (hr == STRSAFE_E_INSUFFICIENT_BUFFER)
{
//문자열이 잘려도 그대로 출력
_tprintf(TEXT("[%u] %s =%s\n"), current, szName, szValue);
}
else
{
_tprintf(TEXT("[%u] %s = ???\n"), current, szName);
break;
}
}
}
else
{
_tprintf(TEXT("[%u] %s\n"), current, szName);
}
current++;
//문자열 끝으로 이동
while (*pszCurrent != TEXT('\0'))
pszCurrent++;
pszCurrent++;
if (*pszCurrent == TEXT('\0'))
break;
}
FreeEnvironmentStrings(pEnvBlock); //환경블럭 내용 문자열 블럭 해제
}
int _tmain(int argc, TCHAR* argv[])
{
GetEnv();
return 0;
}
우리가 내PC 속성 -> 고급설정 -> 환경변수에 들어가면 환경 변수들이 나옵니다 .
그것을 콘솔창에 나타내주는 것입니다.
(sample_code를 가지고 있고 나중에 쓸 일 있으면 사용하라는데 ...
아직까진 잘 모르겠습니다. )
위에 코드는 모든 환경변수를 나타내는 것인데 어떤 특정한 환경변수를 나타내고 싶을 때
아래와 같이 씁니다.
#include <stdio.h>
#include <tchar.h>
#include <Windows.h>
#include <strsafe.h>
#include <stdlib.h>
void PrintEnvironmentVariable(PCTSTR pszVariableName)
{
PTSTR pszValue = NULL;
DWORD dwResult = GetEnvironmentVariable(pszVariableName, pszValue, 0); //특정 변수, 특정변수 포인터주소 , 길이
//길이를 모르기 때문에 0 , 변수를 주면 알아서 길이 체크해서 리턴해줌
if (dwResult != 0)
{
DWORD size = dwResult * sizeof(TCHAR);
pszValue = (PTSTR)malloc(size);
GetEnvironmentVariable(pszVariableName, pszValue, size);
_tprintf(TEXT("%s=%s \n"), pszVariableName, pszValue);
free(pszValue);
}
else
_tprintf(TEXT("%s =<unknown value>\n"), pszVariableName);
}
int _tmain(int argc, TCHAR* argv[])
{
PrintEnvironmentVariable(TEXT("JAVA_HOME"));
return 0;
}
'비트교육 > system_programming' 카테고리의 다른 글
windows_system_programming(1) - kernel object (0) | 2020.09.10 |
---|---|
error 나타내주기 (0) | 2020.09.10 |