기술(Tech, IT)/C++ 17

[C++] Windows Application Subsystem

Windows 애플리케이션은 Console, Windows 두 개의 하위 시스템으로 컴파일이 가능하고, 이 설정은 런타임에 운영체제가 애플리케이션을 어떻게 처리할지를 결정한다. Console Application (CONSOLE subsystem) : 이 유형의 애플리케이션은 console/terminal 과 상호 작용하도록 설계됐다. 실행 시 Windows는 애플리케이션에 콘솔 창은 열결해 std::cout, std::cin 및 기타 표준 C++ I/O 작업을 콘솔 창에서 볼 수 있다. 기존 Command Line Interface (CLI) 에서 콘솔 애플리케이션을 실행하는 경우 기존 콘솔을 출력에 사용한다. Windows Applicaiton (WINDOWS subsystem) : 일반적으로 사용자..

[C++] OutputDebugString() 함수

OutputDebugString() 는 개발자가 디버그 정보를 디버그 출력 창에 출력할 수 있도록 설계된 Windows API 함수다. 이 기능은 프로세스에 디버거가 연결되어 있지 않더라도 프로그래머가 디버거의 출력 창이나 Sysinternals의 DebugView와 같은 도구로 직접 메시지를 보낼 수 있어 개발 및 디버깅 세션 중에 특히 유용하다. 디버깅을 위해 std::cout 을 통해 로그를 출력을 할 수도 있지만, GUI Windows 애플리케이션을 개발할 때 std::cout 으론 출력이 되지 않아(AllocConsole() 같은 다른 함수 추가 등으로 출력 가능), OutputDebugString() 를 사용해 출력할 수 있다. OutputDebugString() 의 구문은 아래와 같다. vo..

[C++] DialogBox() 함수

DialogBox() 는 메모리 또는 애플리케이션의 리소스 파일에 있는 대화 상자 템플릿에서 모달 대화 상자(modal dialog box)를 만드는 Windows API 함수다. CreateDialog() 함수로 만든 모델리스 대화 상자(modeless)와 달리 모달 대화 상자는 입력 포커스를 캡처하고 대화 상자가 닫힐 때까지 사용자가 애플리케이션 내의 다른 창과 상호 작용할 수 없도록 한다. DialogBox() 로 만든 대화 상자의 모달(modal) 특성은 파일 열기, 설정 대화 상자, 확인 등과 같이 애플리케이션에서 진행하기 전에 사용자의 입력이나 결정이 필요한 시나리오에 적합하다. 다음은 DialogBox() 함수의 구문이다. INT_PTR DialogBox( HINSTANCE hInstance..

[C++] CreateDialog() 함수

CreateDialog() 함수는 대화 상장 템플리 리소스에서 모델리스 대화 상자(modeless dialog box)를 만드는 데 사용되는 Windows API의 일부다. 모델리스 대화 상자(modeless dialog box)는 사용자가 애플리케이션의 다른 창과 상호 작용하는 것을 차단하지 않는다. 이는 사용자가 애플리케이션의 다른 부분에 액세스하기 전에 대화 상자와 상호 작용하고 대화 상자를 닫아야 하는 모달 대화 상자(modal dialog box)와는 대조적이다. CreateDialog() 함수는 리소스 스크립트(.rc 파일) 또는 메모리에 정의된 대화 상자를 만드는 데 사용할 수 있다. 대화 상자는 레이아웃, 제어 요소(예: 버튼, 텍스트 상자 등) 및 기타 속성을 지정하는 템플릿을 기반으로 ..

[C++] GetModuleHandle() 함수

GetModuleHandle() 함수는 WIndows의 API로 지정된 모듈을 검색해 반환하는 함수다(모듈의 엔트리 포인트를 반환 - C나 C++에서 main() 또는 WinMain() 함수). Windows에서 모듈이란 실행 파일(.exe) 또는 호출 프로세스의 메모리에 로드된 동적 링크 라이브러리(.dll) 파일을 말한다(쉽게 얘기하면 함수들의 집합 또는 특정 태스크를 처리하기 위한 객). 이 함수는 모듈이 이미 로드돼 있어 메모리에 다시 로드할 필요가 없을 때 작업 수행 시 유용하다. 이 함수는 Windows API의 이부로 Windows 운영 체제에만 해당된다. 크로스 플랫폼 애플리케이션을 개발하는 경우 운영 체제별 세부 사항을 추상화하는 조건부 컴파일 또는 크로스 플랫폼 프레임워크를 사용해야한다..

[Tech, C++] 공통 프로젝트에 대한 솔루션 별 전처리기 정의

Visual Studio 를 통해 C++ 작업을 하다보면 Solution과 Project를 생성하게 된다. 둘에 대해 간단하게 정리하자면 Solution은 하나 이상의 Project를 포함하고, Project는 source code, resource, configuration 등의 파일과 개별 application, library, component 등에 대한 build 지침을 포함하고 있다. 큰 프로그램을 작성하다보면 공통으로 사용되는 코드가 발생한다. 예를 들어, A라는 Project가 공통으로 사용되는 Project일 때, 여러 Solution이 A를 import해 공유해 사용한다고 가정하자. (import를 통한 공유를 하지 않고, 각 Solution 내에 개별적으로 같은 내용의 코드를 갖고있다면..

[Tech, C++] VK_CONTROL

VK_CONTROL은 윈도우 운영 체제에서 키보드의 Ctrl 키에 대한 가상 키 코드를 의미한다. 가상 키 코드는 Windows API (애플리케이션 프로그래밍 인터페이스) 내에서 키보드 키를 나타내기 위해 사용된다. 특히 키보드 관련 이벤트에서 Ctrl 키를 누르거나 놓는 시점을 감지하기 위해 프로그래밍에서 VK_CONTROL 코드가 사용된다. 윈도우 프로그래밍의 맥락에서 개발자는 키보드 단축키를 만들거나 애플리케이션에서 특정 키보드 입력을 처리하는 데 VK_CONTROL을 사용할 수 있다. 예를 들어, 다른 키와 결합하면 Ctrl 키는 텍스트 복사(Ctrl + C), 붙여넣기(Ctrl + V)와 같은 다양한 표준 작업을 수행할 수 있다. 키보드 입력을 처리할 때 VK_CONTROL 키의 상태를 확인해..

[Tech, C++] Accelerator Key (액셀러레이터 키) - Windows

윈도우에서 Accelerator Key (액셀러레이터 키)는 키보드 단축키(keyboard shortcut) 또는 단축키(hotkey)라고도 하며, 같이 누르면 애플리케이션 또는 운영 체제 내에서 특정 기능이나 명령을 수행하는 키 조합이다. 이러한 키는 메뉴를 탐색하지 않고도 기능에 빠르게 액세스하거나 명령을 실행할 수 있는 방법을 제공한다. 일반적으로 Accelerator Key는 다른 키와 함께 누르는 것을 말한다. 예를 들어, 많은 윈도우 애플리케이션에서 Alt + F를 누르면 파일 메뉴가 열린다. Alt 키 외에도 문자, 숫자 또는 기능 키와 조합해 바로 가기를 만드는 데 Ctrl 및 Shift 키와 같은 다른 수정자 키(modifier keys)도 많이 사용된다. 예를 들어, 선택한 텍스트나 개..

[Tech, C++] Symbol Table (심볼 테이블)

Symbol Table은 컴파일러와 링커에서 사용하는 데이터 구조로, 프로그램에서 사용되는 식별자(변수 및 함수 이름 등) 목록과 유형, 범위(가시성), 메모리 위치 등 각 식별자에 대한 정보를 담고 있다. Symbol Table은 컴파일러와 링커가 프로그램 전체에서 이러한 식별자에 대한 참조를 해결하는 데 도움이 된다. 디버깅의 맥락에서 디버그 심볼 내의 Symbol Table은 디버거가 메모리 주소 및 기타 로우-레벨 정보를 사람이 읽을 수 있는 식별자에 다시 매핑하는 데 도움이 된다. 이 매핑을 통해 디버거는 변수 값을 표시하고, 코드 한 줄씩 단계별로 살펴보고, 기타 고급 디버깅 기능을 제공할 수 있다. 컴파일할 때 Symbol Table은 컴파일러가 각 함수와 변수가 어디에 정의 되어 있고 어떻..

[Tech, C++] Debugging Symbols (디버깅 심볼)

Debugging Symbols은 컴파일 과정에서 프로그램의 바이너리에 추가되는 정보로, 바이너리 명령어를 원래 소스 코드에 다시 매핑하는 역할을 한다. 이러한 심볼에는 변수 이름, 함수 이름, 줄 번호와 같은 세부 정보가 포함된다. 디버거 및 기타 도구는 이를 통해 개발자에게 사람이 읽기 쉬운 형태의 프로그램을 표시해 프로그램의 동작을 분석하고 문제를 쉽게 식별할 수 있다. 아래와 같은 C++ 프로그램이 있다고 가정하자. // main.cpp #include void printMessage() { std::cout