비타Cpp

DirectX 2 : 에러 로깅과 문자열 변환기 (Error Logger & String Convertion ) 본문

DirectX11/DirectX 엔진 튜토리얼

DirectX 2 : 에러 로깅과 문자열 변환기 (Error Logger & String Convertion )

멍C 2021. 7. 4. 12:32

본 글은 유튜브의  Jpres님의 영상을 보고 개인적으로 공부하면서 남기는 글입니다.

플레이리스트 링크 : www.youtube.com/playlist?list=PLcacUGyBsOIBlGyQQWzp6D1Xn6ZENx9Y2

 

C++ DirectX 11 Engine Tutorials

Buy my mixtape.

www.youtube.com

영문 영상을 되지도 않는 영어실력과 구글 번역을 돌려가면 열심히 이해하며 쓰는 글이니, 틀린 부분이 많을 수 있습니다.

꼭 발견하면 꾸짖어주세요 ㅎㅎ; 질문도 해주시면 아는 범위 내에서 열심히 답변해드립니다.

 

 


이제 DirectX Engine을 만들면서 필요한 디버깅용 ErrorLogger와 문자열을 변환시켜줄 String Converter를 만든다.

 

ErrorLogger는 빌드 중 치명적인 에러가 발생했을 때 어디서 어떤 에러가 발생했는지 알게 하여 디버깅에 용이하게 만들게 하기 위함이다.그러기 위해서는 문자열을 이용하여 MessageBox에 에러 문구를 띄워야 하는데, StringConverter를 이용하여 문자 변환을 해 줄 것이다.

 

그럼 먼저 클래스 부터 만든다. ErrorLogger와  StringConverter를 만든 후, stdafx.h부터 수정한다.


 stdafx.h

#pragma once

//Includes
#include <Windows.h>
#include <string>
#include <comdef.h>

//DirectX11 Libraries
#pragma comment(lib, "d3d11.lib")
#pragma comment(lib, "DirectXTK.lib")

//namespace
using namespace std;

//Custom Headers
#include "StringConverter.h"
#include "ErrorLogger.h"

이때 Custom Headers의 위치가 매우 중요하다.

Custom Headers에서 사용하는 std, <string>, <comdef.h> 때문에,  이보다 먼저 선언되면 에러를 뿜어낼것이다.


 

std의 문자열은 std::string과 std::wstring이 있는데, 대충 서로 다른 문자형 변수(char, wchar_t) 형을 사용하는 문자열이라고 보면 될 것 같다.

그래서 이를 서로 변환해주는 기능이 필요하여 StringConverter클래스를 만들어준다.


StringConverter.h

#pragma once

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

 

StringConverter.cpp

#include "stdafx.h"
#include "StringConverter.h"

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

이제 string을 wstring으로 바꿔주는 변환기를 만들었으니, ErrorLogger를 만들 차례이다.


ErrorLogger.h

#pragma once

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

ErrorLogger.cpp

#include "stdafx.h"
#include "ErrorLogger.h"

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

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

 

HRESULT는 Com Interface에 소속된 대부분의 함수는 HRESULT값을 가지는데, 이는 함수의 성공 여부와 에러 발생 시 어떠한 종류의 에러 인지도 알 수 있는 변환형이다.


이러면 이제 ErrorLoger와 StringConverter는 완성이다.

이제 Main에서 테스트를 해보자.

 

#include "stdafx.h"
#include "ErrorLogger.h"

int APIENTRY wWinMain(
	_In_ HINSTANCE hInstance,
	_In_opt_ HINSTANCE hPrevInstance,
	_In_ LPWSTR lpCmdLine,
	_In_ int nCmdShow)
{
	ErrorLogger::Log(E_INVALIDARG, "TEST");
	return 0;
}

 

에러 메세지 박스

 

실행을 해보면 이미지처럼 에러 박스가 나온다.

여기서 알 수 있는 건 E_INVALIDARG가 매개 변수가 틀리다는 에러라는 걸 알 수 있다. 

E_INVALIDARG를 F12키를 이용해 타고 들어가 보면 winerror.h에 속한다는 걸 알 수 있다.


https://github.com/charles6919/Tutorial

 

charles6919/Tutorial

블로그용. Contribute to charles6919/Tutorial development by creating an account on GitHub.

github.com

 

'DirectX11 > DirectX 엔진 튜토리얼' 카테고리의 다른 글

DirectX 1 : 기본세팅(3)  (0) 2021.06.15
DirectX 2 : 기본세팅(2)  (0) 2021.03.01
DirectX 1 : 기본세팅(1)  (0) 2020.09.10
Comments