본문 바로가기

Programming

GetLastError() 함수를 통한 에러 확인 Windows 프로그래밍을 할 때 에러를 확인하기 위해서 GetLastError() 를 사용합니다.GetLastError() 함수의 원형은 다음과 같습니다. DWORD WINAPI GetLastError(VOID) GetLastError()는 가장 최근의 에러의 번호를 리턴해줍니다.함수 이름 자체가 함수의 기능을 충실히 설명하고 있습니다.GetLastError()로 에러 번호를 가져올 수 있는데 이 에러의 번호는 미리 정의가 되어있습니다.winerror.h 파일의 정의 내용 중 일부입니다. // // Define the severity codes // // // MessageId: ERROR_SUCCESS // // MessageText: // // The operation completed succes.. 더보기
프로세스 목록 확인하기(작업 관리자) 작업 관리자는 현재 실행 중인 프로세스의 목록을 보여줍니다.작업 관리자와 유사한 형태로 현재 실행 중인 윈도우 목록을 보여주는 방법은 다음과 같습니다.군더더기 코드를 없애기 위해서 콘솔 프로젝트로 작성합니다.창의 타이틀, 파일명, PID 정도를 추출해서 출력하겠습니다.이것은 일단 EnumWindows()라는 API함수를 이용해서 가능합니다.이 함수는 현재 실행되는 윈도우들의 핸들값을 전부 하나씩 첫번째 인자인 함수에 보내줍니다.그리고 실제 처리는 EnumWindowsProc(이름은 바꿔도 됨)에서 해주게 됩니다. #include #include #include #include using namespace std; BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lPa.. 더보기
API, MFC에서 사용하는 변수형 API, MFC를 처음 공부하면 생소한 변수 타입을 자주 접하게 됩니다. API, MFC에서 주로 사용되는 변수 타입은 다음과 같습니다.BOOL기존의 bool(true, false의 값을 가짐)BSTR32비트 문자 포인터BYTE8비트 부호 없는(unsigned) 정수COLORREF색 지정에 사용되는 32비트값(RGB매크로 사용으로 생성 가능)DWORD32비트 부호 없는(unsigned) 정수, 세그먼트 어드레스 / 옵셋LONG32비트 부호 있는 정수LPARAM윈도우 프로시저 또는 콜백 함수의 인수로서 넘어가는 32비트 값LPCSTR문자열 32비트 포인터(const 속성)LPSTR문자열 32비트 포인터LPCTSTR정수문자열로의 32비트 포인터(Unicode 지원)LPTSTR문자열로의 32비트 포인터(Uni.. 더보기
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.. 더보기
윈도우 리전(Region) 설정해서 윈도우 모양 바꾸기 윈도우 리전(Region)은 똑같은 사각형 형태의 밋밋한 윈도우의 모습을 바꿔줍니다.자기가 만들고 싶은 모양을 얼마든지 만들 수 있습니다.윈도우 리전을 생성하는 API함수는 다음과 같이 있습니다.CreatePolygonRgn(); CreateRectRgn(); CreateEllipticRgn();딱 봐도 그 용도가 보이는 참 착한 함수입니다.Polygon은 다각형, Rect는 사각형, Elliptic은 원을 그리는 용도로 쓰입니다.이 함수들 외에도 생성된 리전을 합쳐주는 함수와 만들어진 리전을 화면에 세팅하는 함수가 있습니다.CombineRgn(); SetWindowRgn();이 함수들이 그런 역할을 수행하는 함수입니다.CombineRgn() 은 만들어진 리전을 합치는데 사용하는 함수입니다.SetWind.. 더보기
sealed 키워드를 사용한 클래스 상속 방지 C++에서는 일반적으로 상속을 막는 방법이 없었습니다.MFC에서는 CString을 상속해서 확장하는 것을 권하지 않고 있습니다.(CString은 CStringT 템플릿을 사용하게 되어 있는데 소멸자가 virtual이 아닙니다.)하지만 이것을 강제할 방법은 없었습니다.다만 C++11 이후에 상속을 막을 수 있는 키워드가 추가 되었습니다.다음 링크에서 확인이 가능합니다.2014/12/21 - [Programming/C++11&14] - [C++11] final과 override물론 생성자등을 private로 선언하거나 하면, 원하는 기능을 구현할 수는 있습니다.하지만 C#에서는 좀 더 쉽게 상속을 막을 수 있는 장치가 마련되어 있습니다.이렇게 무분별한 상속을 막기 위해서 C#에서는 sealed라는 키워드가 .. 더보기
다중 실행 방지 코드(CreateMutex) 프로그램을 보면 하나의 프로세스(실행되어진 프로그램)만 허용하는 경우가 있습니다.보통 게임에서 물가 안정 등의 이유로 다중 실행 방지를 많이 사용합니다.그래서 그걸 깨는 멀티로더들도 암암리에 제작이 됩니다.다중 실행을 방지하는 코드는 뮤텍스라는 걸 사용합니다.물론 뮤텍스가 아닌 다른 커널 오브젝트를 사용해도 가능합니다.뮤텍스는 커널 오브젝트기 때문에 모든 프로세스를 통틀어서 하나만 존재합니다.이 뮤텍스가 중복되는 지 확인(이미 존재하는가 확인)하면 되는것이죠.이 뮤텍스를 이용한 방법을 알아보도록 하겠습니다. #include #include HANDLE hMutex = nullptr; int main() { hMutex = ::CreateMutex(nullptr, TRUE, _T("Unique_Name_o.. 더보기
C#의 Property(속성) C#에서는 기본으로 제공하는 Property라는 것이 있습니다.기존의 C++이나 JAVA 같은 경우에는 Property와 같은 역할을 하는 것이 Getter와 Setter라는 함수입니다.객체의 속성을 나타내는 멤버 변수는 대부분 private 내지는 protected 형식으로 정의가 됩니다.하지만, 이렇게 되면 외부에서는 직접 접근이 불가능합니다. 이럴 때, Getter와 Setter를 사용해서 값을 수정하고 가져오게 됩니다.기존에는 클래스가 int x와 int y를 갖고 있을 때, 이 값을 가져올 때는 GetX()를 사용하고 SetX()를 생성해서 값을 입력할 때 사용합니다.해당 클래스를 사용하는 입장이나 작성하는 입장이나 굉장히 불편한 방법입니다.그래서 C#에서는 Property라는 것을 기본적으로 .. 더보기