프로세스 환경변수
환경변수는 프로세스별로 별도의 메모리 공간에 문자열 데이터를 저장하고 관리 할 수 있도록 되어있습니다. 문자열 구조는 key = value로 이루어져 있습니다.
마치 python에서 dictionary 방식? 이라고 생각하면 쉬울 것 같습니다.
EnvParent.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | #include <stdio.h> #include <tchar.h> #include <Windows.h> int _tmain(int argc, TCHAR* argv[]) { SetEnvironmentVariable(_T("Good"), _T("morning")); SetEnvironmentVariable(_T("Hey"), _T("Ho!")); SetEnvironmentVariable(_T("Big"), _T("Boy")); STARTUPINFO si = { 0, }; PROCESS_INFORMATION pi = { 0, }; si.cb = sizeof(si); TCHAR command[] = _T("EnvChild"); int result = CreateProcess(NULL, command, NULL, NULL, FALSE, CREATE_NEW_CONSOLE | CREATE_UNICODE_ENVIRONMENT, NULL, NULL, &si, &pi); if (result == 0) { printf("%d", GetLastError()); } CloseHandle(pi.hProcess); CloseHandle(pi.hThread); return 0; } | cs |
EnvChild.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #include <stdio.h> #include <tchar.h> #include <Windows.h> #define BUFSIZE 1024 int _tmain(int argc, TCHAR* argv[]) { TCHAR value[BUFSIZE]; if (GetEnvironmentVariable(_T("Good"), value, BUFSIZE) > 0) { _tprintf(_T("[%s = %s]\n"), _T("Good"), value); } if (GetEnvironmentVariable(_T("Hey"), value, BUFSIZE) > 0) { _tprintf(_T("[%s = %s]\n"), _T("Hey"), value); } if (GetEnvironmentVariable(_T("Big"), value, BUFSIZE) > 0) { _tprintf(_T("[%s = %s]\n"), _T("Big"), value); } Sleep(10000); return 0; } | cs |
책에서는 EnvParent.cpp 16라인에서 command 대신에 바로 문자열을 넣어주고 있는데 책의 예제로 따라하면 에러가 발생합니다. 이유를 찾아보니 만약 notepad.exe를 실행하는데 CreateProcess로 실행시킬 경우 뒤에 추가로 텍스트 파일의 이름을 인자로 넘길 수 있는데 이러한 것을 내부적으로 파싱해서 처리하는데 문자열 상수의 포인터를 가지고 파싱을 시도하면 메모리 엑세스 에러가 난다고 합니다.
출처: http://beautyrain.tistory.com/10
따라서 TCHAR 배열로 만들어서 실행하면 정상적으로 실행이 됩니다.
'High Level Technique > Window System' 카테고리의 다른 글
쓰레드 (Thread) (0) | 2017.01.02 |
---|---|
우선순위 알고리즘 (0) | 2017.01.02 |
Anonymouse Pipe, Named Pipe (0) | 2016.12.30 |
Pseudo Handle, Handle Duplicate (0) | 2016.12.28 |
핸들 테이블과 오브젝트 핸들의 상속 (0) | 2016.12.28 |