본문 바로가기

Study/DirectX11

DirectX 공부 2일차 - ErrorLogger & StringConverter

이제 엔진을 만들면서 유용하게 사용할 에러 로그 출력기문자열 변환기를 만들어 본다.

두 기능은 Util폴더를 만들어 따로 관리할 수 있도록 한다.

 

먼저 솔루션 탐색기 상단에 모든 파일 표시를 활성화하여 

아래 그림처럼 윈도우 탐색기처럼 폴더가 표시되게 한다.

그다음 프로젝트에 오른쪽 마우스를 눌러 추가 > 새 폴더로 폴더를 추가한 뒤 이름을 Utils로 해준다. 

 

폴더를 만든후 다시 모든 파일 표시를 해제한 뒤 소스파일 필터와 헤더 파일 필터에 각각 Utils필터를 추가해준다.

 

필터는 실제로 폴더가 생성되는것이 아니라 솔루션 자체에서 관리를 위해 논리적으로만 분류해주는 필터이다.

이제 해당 필터에 클래스를 추가해 준다.

먼저 StringConverter를 만들어주고,

Utils폴더 아래에 클래스를 만들어야 하기 때문에 "..." 버튼을 눌러 헤더와 cpp파일의 생성 위치도 지정해 줘야 한다.

 

 

String Converter의 내용은 다음과 같다.

 

StringConverter.h

#pragma once
#include <string>
using namespace std;

class StringConverter
{
public:
	static wstring StringToWide(string str);
};

 

StringConverter.cpp

#include "StringConverter.h"

wstring StringConverter::StringToWide(string str)
{
	wstring wideStr(str.begin(), str.end());
	return wideStr;
}

 

ErrorLogger클래스도 마찬가지로 Utils폴더에 생성한 뒤, 아래 코드로 작성한다.

 

ErrorLogger.h

#pragma once
#include <Windows.h>
#include "StringConverter.h"
using namespace std;

class ErrorLogger
{
public:
	static void Log(string message);
	static void Log(HRESULT hr, string message);
};

ErrorLogger.cpp

#include "ErrorLogger.h"
#include <comdef.h>

void ErrorLogger::Log(string message)
{
	string errorMsg = "Error : " + message;
	MessageBoxA(NULL, errorMsg.c_str(), "Error", MB_ICONERROR);
}

void ErrorLogger::Log(HRESULT hr, string message)
{
	_com_error error(hr);
	wstring errorMsg = L"Error : " + StringConverter::StringToWide(message) + L"\n" + error.ErrorMessage();
	MessageBoxW(NULL, errorMsg.c_str(), L"Error", MB_ICONERROR);
}

코드를 작성한 뒤 솔루션 탐색기를 보면 방금 만든 클래스들이 Utils 필터 내에 없고 소스 필터와 헤더 필터에 있을 것이다. 이는 필터 안에 없을 뿐이지 Utils폴더에는 잘 들어가 있는 것이니 이는 직접 드래그해서 넣어주면 된다.

 

이젠 Main.cpp에서 ErrorLogger를 이용하여 에러 메시지를 띄워보자. 

 

Main.cpp

#pragma once
#include "Utils/ErrorLogger.h"
//#include <Windows.h> ErrorLogger.h에 정의 되어 있으니 생략...
#pragma comment(lib, "d3d11.lib")
#pragma comment(lib, "DirectXTK.lib")

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
	_In_opt_ HINSTANCE hPrevInstance,
	_In_ LPWSTR lpCmdLine,
	_In_ int nCmdShow)
{
	HRESULT hr = E_INVALIDARG;
	if (FAILED(hr))
	{
		ErrorLogger::Log(hr, "FAILURE");
	}
	return 0;
}

 

코드를 작성한 뒤 실행해보면 에러 문구가 적힌 메시지 박스가 나오며 종료된다.

 

'Study > DirectX11' 카테고리의 다른 글

DirectX 공부 1일차 - 개발환경 구축하기  (0) 2022.03.30