[Windows via C/C++] Part 1. 01. 에러 핸들링, 02. 문자와 문자열로 작업하기, 03. 커널 오브젝트
제프리 리처의 Windows via C/C++ 를 읽고
나중에 기억하기 위한 정리를 하려고 한다.

Part 1. 01. 에러 핸들링
- 다양한 윈도우 함수들은 에러값을 반환한다. 모든 에러 코드를 32비트 숫자로 정의해둠 (WinError.h)
- 윈도우 함수가 실패하게 되면 내부적으로 함수를 호출한 스레드의 thread local storage에 저장하며, GetLastError 함수로 확인할 수 있다.
- 만일 이 함수를 호출하기 전에 다른 함수를 호출하게 되면 다른 함수의 수행 결과가 겹쳐 써진다.
- 마이크로소프트는 이러한 메커니즘을 유저가 직접 개발한 함수에도 적용시킬 수 있도록 해두었다. void SetLastError(DWORD dwErrCode) 를 사용하여 스레드의 마지막 에러코드를 설정하고, 적절한 값을 반환하도록 함수를 작성하면 된다.
- 가능한한 윈도우에 정의되어 있는 에러 코드를 사용하고, 유저가 에러코드를 작성할 수도 있다.
Part 1. 02. 문자와 문자열로 작업하기
- 반드시 유니코드 기반 코드를 사용하자. 애플리케이션의 수행성능을 향상시킬 수 있고, 지역화를 좀 더 쉽게 할 수 있으며 상호운용에도 도움이 된다.
- 전세계의 대부분의 언어가 16비트로 표현 가능하기 때문에 윈도우는 UTF-16 인코딩을 사용. 프로그램 내에서 사용하는 문자열을 보다 쉽게 다른 언어로 변경 가능.
- 문자열을 다루는 함수들은 결과를 담기 위한 문자열 버퍼가, 결과를 담기에 충분하지 않다면 메모리 관련 문제가 발생할 것이다. ex. strcpy(), wcscpy() . 좀 더 안전한 코드를 작성하기 위해 새로 제공되는 안전 문자열 함수들을 사용하자 (ex. _tcscpy 대신 _tcscpy_s 처럼 _s 가 붙은 문자열 함수들)
- 이러한 함수들은 쓰여질 버퍼와 함께 버퍼의 크기도 인자로 전달하도록 정의되어 있다. 안전 문자열 함수는 내부적으로 인자의 유효성을 검증한다. 이 검증 단계에서 인자가 NULL인지, 정수 값이 유효한 범위내에 있는지, 열거형 값이 유효한지, 버퍼는 결과를 저장할 만큼 충분한지 등을 테스트 하며, 테스트가 실패하면 thread local storage 변수인 errno에 에러 코드를 설정하고 실패 값을 반환한다.
Part 1. 03. 커널 오브젝트 ✨
- 커널 오브젝트란 : OS는 다양한 형태의 커널 오브젝트를 생성하고 조작한다. 각 커널 오브젝트는 커널에 의해 할당된 간단한 메모리 블록이다. 이 메모리 블록은 커널에 의해서만 접근이 가능한 구조체로 구성되어 있으며, 커널 오브젝트에 대한 세부 정보들을 저장하고 있다. 이렇게 구조체의 직접적인 접근을 제한함으로써 마이크로소프트는 이미 개발되어 있는 애플리케이션에 영향을 미치지 않고도 구조체에 내용을 임의로 추가, 삭제, 변경할 수 있다.
-