Windows System Programming C++ 개발과 유니코드용 API

mohadang·2023년 4월 23일
0
post-thumbnail

C++로 Windows 응용 프로그램(Consol, API, MFC, ...) 개발시 다양한 문자 셋을 접할 수 있다
DBCS(Double Bytes Character Set)등 지금은 잘 사용하지 않는 문자도 있으며 ANSI와 유니코드 문자와 같이 여전히 사용하고 있는 문자들 역시 접할 수 있다.
요즘은 Web의 영향으로 거의 모든 시스템이 문자를 처리할때 UTF-8을 표준으로 사용하지만 윈도우는 기본적으로 UTF-16 유니코드를 사용한다.
윈도우 역시 UTF-8의 추세에 맞춰 최근에는 메모장을 열면 UTF-8이 기본인데 Windows 7 에서는 메모장을 열면 UTF-16을 기본으로 열었던 것으로 기억한다(내 개인적인 기억이라 정확하지는 않다)

윈도우에서 wchat_t, wstring, LPCWSTR 사용시 visual studio 에서 설정한 char set에 따라 달라질텐데 기본은 UTF-16 이며 C# 역시 문자열은 기본이 UTF-16이다.

윈도우에서는 API도 ANSI와 유니코드용 API를 별도 지원한다.

// ANSI
BOOL CreateProcessA(
  [in, optional]      LPCSTR                lpApplicationName,
  [in, out, optional] LPSTR                 lpCommandLine,
  [in, optional]      LPSECURITY_ATTRIBUTES lpProcessAttributes,
  [in, optional]      LPSECURITY_ATTRIBUTES lpThreadAttributes,
  [in]                BOOL                  bInheritHandles,
  [in]                DWORD                 dwCreationFlags,
  [in, optional]      LPVOID                lpEnvironment,
  [in, optional]      LPCSTR                lpCurrentDirectory,
  [in]                LPSTARTUPINFOA        lpStartupInfo,
  [out]               LPPROCESS_INFORMATION lpProcessInformation
);
//UNICODE
BOOL CreateProcessW(
  [in, optional]      LPCWSTR               lpApplicationName,
  [in, out, optional] LPWSTR                lpCommandLine,
  [in, optional]      LPSECURITY_ATTRIBUTES lpProcessAttributes,
  [in, optional]      LPSECURITY_ATTRIBUTES lpThreadAttributes,
  [in]                BOOL                  bInheritHandles,
  [in]                DWORD                 dwCreationFlags,
  [in, optional]      LPVOID                lpEnvironment,
  [in, optional]      LPCWSTR               lpCurrentDirectory,
  [in]                LPSTARTUPINFOW        lpStartupInfo,
  [out]               LPPROCESS_INFORMATION lpProcessInformation
);

이런 API 들은 뒤에 문자가 ~A, ~W 로 구분을 한다.
윈도우 개발시 시스템에서 ANSI와 유니코드를 유동적으로 바꿔서 컴파일 할 수 있도록
CreateProcess API, TEXT, T 와 같은 매크로를 지원한다.
직접적으로 char, wchat_t 대신 TCHAR를 사용하고 CreateProcessA, CreateProcessW 대신 CreateProcess 를 사용하면 매크로 치환 과정에서 char, wchat_t, CreateProcessA, CreateProcessW 로 변환된다.

하지만 이런 방식은 굉장히 구시대적 방식으로 생각되며 최근에는 이렇게 처리할 필요가 없다고 생각된다.
MFC와 같이 C/C++ 로 사용자 UI를 처리한다면 이런 처리는 분명 필요하다.
하지만 MFC를 사용한 개발은 점점 사장되고 있으며 UI 처리부분은 WFP와 같은 현대적 프레임워크에서 처리한다.
그리고 이런 프레임워크는 기본적으로 본인들 만의 문자열 처리 방식이 있기에 TEXT 같은 매크로 처리가 필요 없다.

윈도우 시스템 프로그래밍은 점점 UI 처리 부분이 사라지고 윈도우의 Core 모듈(드라이버, 서비스, 백신, 네트워크, ...)을 처리 하는 부분만 남겨지고 있다. Core 처리야 사용자가 직접적으로 제어할 일이 없으며 그렇게 되어서도 안된다.

그리고 Core 부분에서는 유니코드를 사용할 일이 없을 것이라고 본다.
CreateProcessW를 호출할때 파일 경로가 한글이면 어떻게 하냐고 생각 해볼 수 있지만 한글 경로라도 ANSI에 한글 경로를 입력하면 CreateProcessA를 정상 호출 할 수 있다.

profile
mohadang

0개의 댓글