본문 바로가기

Win32 Api

특수한 폴더의 경로를 알아오기 Windows를 사용하다보면, 특수한 폴더들이 몇 군데 있습니다.일단 대표적인 게 Windows가 설치된 폴더, System 폴더가 있습니다.바탕화면 폴더, 폰트 폴더 등도 특수한 폴더에 속합니다.이러한 폴더 주소는 사용자마다 다를 수 있기 때문에 프로그래밍시에 직접 넣는 것은 위험할 수 있습니다.쉘 함수 중에 이런 특수한 폴더의 경로를 알아내는 함수가 존재합니다. HRESULT SHGetSpecialFolderLocation(HWND hwndOwner, int nFolder, PIDLIST_ABSOLUTE *ppidl) SHGetSpecialFolderLocation() 라는 함수입니다.첫 번째 인자는 미래를 위해서 예약된 인자이므로 NULL을 넣어줍니다.두 번째 인자가 가장 중요한 부분인데 원하는 폴.. 더보기
MFC의 CFileFind를 이용한 파일명 열거 MFC에서는 파일을 찾고 나열하기 쉽도록 CFileFind라는 클래스가 존재합니다.이 클래스를 사용하면 굉장히 편리하게 파일을 나열할 수 있습니다.소스 코드는 다음과 같습니다.찾을 파일의 형식이나 파일명을 지정하고 검색을 하시면 됩니다.이것은 MSDN에 나온 예제입니다. CFileFind finder; BOOL bWorking = finder.FindFile("*.*"); while (bWorking) { bWorking = finder.FindNextFile(); cout 더보기
MFC, API 프로그래밍에서 유니코드 처리하기 요즘은 거의 대부분 유니코드를 적용해서 프로젝트를 진행할 것으로 보입니다.멀티바이트 문자열을 받는 대부분의 Win32 API 함수들은 유니코드로 바꿔서 다시 유니코드 함수를 호출해줍니다.그러니 바로 유니코드 형식을 사용하는 편이 더 효율적이라고 할 수 있습니다.일반적으로 API 함수가 오류가 나면 함수명에 A나 W가 붙죠.MessageBox라는 메시지 박스를 띄우는 게 오류시 MessageBoxA / MessageBoxW로 표기가 됩니다.여기서 A냐 W냐가 멀티바이트 코드 함수, 유니코드 함수로 구분이 됩니다.멀티바이트 코드인가 유니코드 프로젝트인가를 확인해서 해당하는 API를 호출하는 것은 #define 전처리기를 통해 가능합니다.#define UNICODE로 정의되어 있으면 자동으로 유니코드 함수를 .. 더보기
Windows 메시지의 구조와 처리 Windows 프로그래밍은 메시지를 기반으로 하는 프로그램을 작성합니다.Windows는 메시지를 끊임없이 발생시키고 이 메시지를 처리하게 만들어 주는 것입니다.Win32 프로그래밍을 하다보면 메시지 루프라는 용어가 쓰입니다.이 부분이 메시지를 받아서 메시지를 처리하는 부분이 됩니다.WinMain에는 다음과 같은 코드가 들어가 있습니다. MSG msg; HACCEL hAccelTable; // Initialize global strings LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDC_WIN32PROJECT1, szWindowClass, MAX_LOADSTRING); MyRegisterClass.. 더보기
GetLastError() 함수를 통한 에러 확인 Windows 프로그래밍을 할 때 에러를 확인하기 위해서 GetLastError() 를 사용합니다.GetLastError() 함수의 원형은 다음과 같습니다. DWORD WINAPI GetLastError(VOID) GetLastError()는 가장 최근의 에러의 번호를 리턴해줍니다.함수 이름 자체가 함수의 기능을 충실히 설명하고 있습니다.GetLastError()로 에러 번호를 가져올 수 있는데 이 에러의 번호는 미리 정의가 되어있습니다.winerror.h 파일의 정의 내용 중 일부입니다. // // Define the severity codes // // // MessageId: ERROR_SUCCESS // // MessageText: // // The operation completed succes.. 더보기
MFC에서 프로그램의 hInstance와 hWnd 구하기 MFC에서 hInst와 hWnd를 필요로 할 때가 있습니다.Win32 API함수 등을 이용할 때 사용해야 할 필요가 생깁니다. // hInstance를 구하는 법 AfxGetInstanceHandle(); // hWnd를 구하는 법 GetSafeHwnd(); 이 2개를 이용해서 사용하면 됩니다.예제 코드는 다음과 같습니다. ::SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, ::GetWindowLong(GetSafeHwnd(),GWL_EXSTYLE) | WS_EX_LAYERED); this->SetLayeredWindowAttributes(RGB(0, 0, 255), 128, LWA_ALPHA | LWA_COLORKEY); 윈도우를 투명하게 만들어주는 코드로 GetSafeHwn.. 더보기