비트교육/system_programming

error 나타내주기

ballde 2020. 9. 10. 22:40

이번에는 error을 나타내주는 실습을 해보겠습니다.

 

 

이 코드는 윈도우속성-> 링커-> 시스템-> 창모드로 해야합니다. 

시작하기에 앞서, <tchar.h>이것은 유니코드나 멀티바이트코드 어디에서나 사용가능하게 알아서 바꿔주는 매크로 함수입니다.

LPTSTR, _tWinMain등 t가 붙어있는 것들은 f12로 들어가서 보면 유니코드 경우와 멀티바이트 경우와 다르다는 것을 볼 수 있습니다. 

 

#include <windows.h>
#include <tchar.h>	        //유니코드, 멀티바이트 코드 무엇을 쓰든지 확인해서 바꿔주는 메크로 

#define MAX_LOADSTRING 100	

TCHAR szTitle[MAX_LOADSTRING] = TEXT("Sample");
TCHAR szWindowClass[MAX_LOADSTRING] = TEXT("Bit");

HWND hWnd;

void MakeEdit(void) {

	//함수의 인자는 구글링해서 보기 
	HWND testEdit = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT"), NULL,
		WS_CHILD | WS_VISIBLE | WS_BORDER | ES_AUTOHSCROLL,
		10, 10, 200, 22, NULL, NULL, NULL, NULL);    //뒤에서 4번째가 문제 

	

	if (testEdit == NULL) {
		
		DWORD error_code = GetLastError();
		TCHAR error_string[64];
		wsprintf(error_string, TEXT("%d"), error_code);
		MessageBox(hWnd, error_string, TEXT("ERROR"), MB_OK);

	}
	
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	switch (msg) {
	case WM_LBUTTONDOWN:
		MakeEdit();
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return DefWindowProc(hwnd, msg, wParam, lParam);
}

ATOM MyRegisterClass(HINSTANCE hInstance)
{
	WNDCLASSEX wcex;
	wcex.cbSize = sizeof(WNDCLASSEX);
	wcex.style = CS_HREDRAW | CS_VREDRAW;
	wcex.lpfnWndProc = WndProc;
	wcex.cbClsExtra = 0;	
	wcex.cbWndExtra = 0;
	wcex.hInstance = hInstance;
	wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
	wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
	wcex.lpszMenuName = 0;
	wcex.lpszClassName = szWindowClass;
	wcex.hIconSm = 0;

	return RegisterClassEx(&wcex);
}

HWND InitInstance(HINSTANCE hInstance, int nCmdShow)
{
	HWND hWnd;
	hWnd = CreateWindowEx(0, szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0,
		CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

	if (!hWnd)
	{
		return 0;
	}

	ShowWindow(hWnd, nCmdShow);
	

	return hWnd;
}

int WINAPI _tWinMain(HINSTANCE hInst, HINSTANCE hPrev, LPTSTR lpCmdLine, int nShowCmd)
{
	MyRegisterClass(hInst);
	HWND hwnd = InitInstance(hInst, nShowCmd);
	if (hwnd == 0) {
		return FALSE;
	}
	MSG Message;
	while (GetMessage(&Message, NULL, 0, 0)) {
		TranslateMessage(&Message);
		DispatchMessage(&Message);

	}
	return 0;
}

 

이것을 실행시키면 번호가 나오게 되는데 에러번호입니다. 

MS - 공식문서에서 CreateWindowEx -> GetLastError 들어가서 애러코드를 보면 찾을 수 있습니다. 

근데 숫자로 보는 것보다 어떤 메세지인지 바로 뜨는게 눈으로 보기 좋기 때문에 코드를 바꿔보겠습니다. 

if (testEdit == NULL) {
		LPTSTR p_error_message;

		GetLastError오류 코드 값에 대한 설명을 에러 코드를 문자열 형태로 저장(p_error_message에)
		FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
			FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(),
			MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT)
			// MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)
			,(LPTSTR)&p_error_message, 0, NULL);

		MessageBox(hWnd, p_error_message, TEXT("ERROR"), MB_OK);
		free(p_error_message);
	}
	

이 부분만 바꿔주면 됩니다. 

//주석한 부분은 한글로 나타내 주는 코드입니다. 

'비트교육 > system_programming' 카테고리의 다른 글

windows_system_programming(1) - kernel object  (0) 2020.09.10
환경변수 나타내기  (0) 2020.09.10