본문 바로가기

개발/Windows32

[Win32] 메시지 루프는 어떻게 창에 메시지를 전달할까? 하나의 윈도우 프로그램에는 여러 개의 창이 존재한다. 그리고 그 창에는 자기한테 들어온 메시지를 처리하기 위해 각자의 프로시저(Procedure)를 갖는다(엄밀히 창 클래스마다 프로시저를 갖는다). 그렇다면 어떻게 메시지 루프는 메시지에 알맞은 창을 찾을 수 있을까? 다음은 일반적인 윈도우 프로그램의 메인 메시지 루프(싱글스레드)이다. // Main message loop: while (GetMessage(&msg, nullptr, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } 메시지 큐에서 GetMessage로 메시지를 가져와 Transla.. 2022. 7. 31.
[Win32] 윈도우의 닫기 버튼을 눌렀을 때 일어 나는 일 (WM_CLOSE) 이번 포스트에서는 Win32 GUI프로그래밍을 공부하면서 거의 처음으로 배우는 내용인 윈도우가 닫힐 때 일어나는 일에 대해서 알아보겠다. 쌩으로 Win32부터 MFC, WTL까지 하다보니 좀 오래전에 공부해서 인지 가물가물하여 다시한번 리마인드 차원에서 정리해본다. Windows에서 창의 닫기 버튼을 눌렀을때 어떤일이 발생할까? 사용자가 닫기창이 눌렸을 때, 개발자는 많은 것을 고려해야 할 수 있다. 단순히 창을 hide할 것인지, 정말로 프로그램을 종료할 것 인지? 종료한다면 메모리정리, 리소스 정리, 사용자가 작업한 내용, 프로그램의 상태등을 안전하게 정리할 것인지 고려 해야 할 수 있을 것 이다. 닫기동작은 나름 그래서 중요하다고 생각한다. 그럼 닫기 버튼을 눌렀을 때 어떤 일이 발생할까? http.. 2022. 7. 31.
HIWORD, LOWORD 매크로, DWORD 쪼개기 Windows 프로그래밍을 하다보면 32bit 자료형인 DWORD를 쪼개야 할때가 생긴다. 예를 들면 WM_LBUTTONDOWN와 같은 마우스 메시지의 lParam변수에는 마우스 좌표가 들어 있는데, X축은 하위 16비트, Y축은 상위 16비트에 존재 한다. 이때 상위, 하위 16비트를 쪼개어야 X축 Y축을 알 수 있다. 그렇다면 대충 코드 비트연산을 다음과 같이 할 수 있을 것이다. DWORD dwXPos = ((((DWORD)lParam)) & 0xffff); DWORD dwYPos = ((((DWORD)lParam >> 16)) & 0xffff); 이렇게 할 수 있지만 상당히 거추장스러운 코드 처럼 보인다. 이렇게 가독성이 떨어지는 코드를 막기위해 Windows SDK에서는 매크로를 정의해 놓았다... 2022. 6. 16.
리소스 문자열을 CString으로 불러오는 법 (win32,mfc) 보통 MFC, Win32 애플리케이션을 개발할 때 리소스파일에 문자열을 정의하여 불러 쓴다. 이렇게 하는 이유는 코드와 리소스가 분리되어 유지보수의 편리함이 생기고, 다국어지원등에 유리할 수 있기 때문이다. 이번 포스트에서는 MFC에서 리소스에 정의된 문자열을 CString으로 불러오는 법을 알아 보겠다. 1. LoadString 일반적으로 CString에서 리소스파일의 문자열을 불러오려면 LoadString 멤버함수를 이용한다. **`CStringT`** Class | Microsoft Docs **`CStringT`** Class API reference for the Microsoft ATL **`CStringT`** class docs.microsoft.com 예제 코드는 다음과 같다 CStrin.. 2022. 3. 2.
OpenJDK 다운로드 , 마이크로소프트에서 받자. 최근 OpenJDK를 윈도우에 설치할 일이 생겼었다. 윈도우에서 JDK를 설치하려면 압축을 풀어서 적절한 경로에 넣고 환경변수를 일일히 잡아줘야 하는게 일반적이다. OpenJDK를 공식으로 배포하는 공식 홈페이지에서는 zip파일 형태로 배포하기 때문에 마냥 귀찮지 않을 수 없다. 또 Pre빌드 해놓은 깃허브도 존재하는데 이것도 좀 믿기힘들다. https://jdk.java.net/archive/ Archived OpenJDK GA Releases Archived OpenJDK General-Availability Releases This page is an archive of previously released builds of the JDK licensed under the GNU General Pub.. 2022. 2. 25.
[Win32] WM_ERASEBKGND에서 리턴 값의 의미? 최근 UI를 개발하다가 WM_ERASEBKGND 콜백을 구현할 일이 생겼었다. MFC에서 주로 개발을 했었고, 깜박임 방지 등을 위해 습관적으로 FALSE를 리턴하고 있었다.(사실 잘못 쓰고 있었다) 이번에도 아무생각 없이 WM_ERASEBKGND콜백에서 0을 리턴을 해버렸는데 코드리뷰에서 문제가 제기 되었다. 1과 0의 차이는 무엇일까? 이번 기회에 좀 찾아 보았다. 참고로 나의 경우 WM_ERASEBKGND에서 배경을 그리고 WM_PAINT에서 글씨를 그리는 작업을 하고 있었다. WM_ERASEBKGND 는? 가장 정확한 레퍼런스는 MSDN이다. https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-erasebkgnd 우선 WM_ERASEBKNG 콜백에.. 2022. 2. 24.
C++/WinRT의 필요성 - 노트북 배터리 정보 구하기 마이크로소프트에서 수년간 유지해온 Win32 API를 밑에 두고 대 모바일 시대에 다양한 디바이스에서 일괄적인 인터페이스를 제공하기 위해 만든 Windows Runtime 라이브러리를 C++인터페이스로 사용할 수 있게 되었다. 그것이 바로 C++/WinRT . https://docs.microsoft.com/ko-kr/windows/uwp/cpp-and-winrt-apis/intro-to-using-cpp-with-winrt C++/WinRT 소개 - UWP applications Windows 런타임 API용 표준 C++ 언어 프로젝션인 C++/WinRT에 대한 소개입니다. docs.microsoft.com Win32 애플리케이션만 만들어온 개발자로써 좀 이해가 가지 않는다. 빠른빌드 속도, C++ 1.. 2021. 11. 18.
드라이버에서 파일 읽기 예제/ ZwOpenFile ,ZwReadFile 유저모드 프로그램에서 파일을 읽을 때에는 CreateFile API를 통해 파일을 열고 ReadFile함수 이용하여 파일을 읽습니다. 드라이버 개발을 할 때에도 간혹 파일 처리를 해야할 때가 있는데 이때 사용 가능한 커널모드 함수로는 Zw계열 함수인 ZwOpenFile, ZwReadFile입니다. 다음 코드는 ZwOpenFile, ZwReadFile 의 예시입니다. void FileRead() { NTSTATUS status = STATUS_SUCCESS; HANDLE hFile = NULL; IO_STATUS_BLOCK iostatus; OBJECT_ATTRIBUTES oa; LARGE_INTEGER byteOffset; UNICODE_STRING uFilename; unsigned char buf[1.. 2020. 11. 12.
Windbg 커널디버깅 설정하기 (Network 디버깅) Windbg 커널디버깅 KDNET 설정하기 (Network 디버깅) 커널 드라이버를 개발하면서 언젠가?는 마주치게 되는 커널디버깅. 과거 물리적인 디버깅 대상 PC의 시리얼포트를 통해 개발 PC와 연결하여 커널디버깅을 했었지만 요새는 가상머신의 시리얼포트에 named 파이프를 설정하여 디버깅을 한다. 하지만 이 방식에는 큰 문제가 있는데 바로 속도의 문제이다. 과거 방식인 물리적인 시리얼포트가 그대로 가상머신에 들어왔을 뿐 인터페이스는 어찌됬건 시리얼포트인 것이다. 디버깅을 지원하는 시리얼 포트의 최대 속도는 115200bps(baudrates). 디버깅을 하는데 못할 정도는 아니지만, 로컬에서 유저모드 애플리케이션을 VS로 붙여서 디버깅하는 만큼 속도도 안나올 뿐더러 커널디버깅 특성상 이벤트자체가 많아.. 2020. 7. 27.