[DirectX 11] 3. DirectX 에러 로깅과 문자열 변환기 (Error Logger & String Converter)

psj98·2022년 10월 18일
0

왜 사용할까?

ErrorLogger는 빌드 중 에러가 발생했을 때, 어디서 어떤 에러가 발생했는지 MessageBox에 에러 문구를 띄워 알려준다.

문자열로 에러를 띄우기 위해 String Converter를 통해 변환을 시켜준다.


문자열 변환기 (String Converter)

[1] StringConverter.h 파일 생성 및 코드 작성

  1. 솔루션 탐색기 클릭
  2. 헤더 파일 우클릭
  3. 추가 -> 새 항목 클릭
  4. 헤더 파일 클릭 후, StringConverter.h 입력 후, 추가

StringConverter.h

#pragma once
#include <string>

using namespace std;

class StringConverter
{
public:
	static wstring StringToWide(string str);
};
  • StringToWide : string을 wstring으로 변환해주는 함수

[2] StringConverter.cpp 파일 생성 및 코드 작성

  1. 솔루션 탐색기 클릭
  2. 소스 파일 우클릭
  3. 추가 -> 새 항목 클릭
  4. 헤더 파일 클릭 후, StringConverter.cpp 입력 후, 추가

StringConverter.cpp

#include "StringConverter.h"

/* string을 wstring으로 변환해주는 함수 */
wstring StringConverter::StringToWide(string str)
{
	wstring wide_string(str.begin(), str.end());
	return wide_string;
}

string과 wstring의 차이

  1. string
    std::string이 정의된 곳

  2. wstring
    std::wstring은 std::string의 wchar_t 버전

    wchar_t

    • unsigned short 형
    • 일반 char는 데이터 사이즈가 작아 표현 문자에 한계가 있어서 표현해야 할 문자가 많을 때 wchar_t 사용
    • 한국어나 다른 언어들을 표현할 때 사용

에러 로거 (Error Logger)

[1] ErrorLogger.h 파일 생성 및 코드 작성

[StringConverter.h 파일 생성 및 코드 작성] 과 동일하게 진행

단, ErrorLogger.h로 생성할 것


ErrorLogger.h

#pragma once
#include "StringConverter.h"
#include <Windows.h> // HRESULT 타입을 사용하기 위해 추가

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

Log : 에러 메시지를 띄워주는 함수

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


[2] ErrorLogger.cpp 파일 생성 및 코드 작성

[StringConverter.cpp 파일 생성 및 코드 작성] 과 동일하게 진행

단, ErrorLogger.cpp로 생성할 것


ErrorLogger.cpp

#include "ErrorLogger.h"
#include <comdef.h> // _com_error 타입 사용하기 위해 추가

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);
}

MessageBoxA(핸들, 내용, 제목, 박스 종류);

  • A는 멀티바이트용 메시지 박스
  • MB_ICONERROR : 오류 모양 박스

MessageBoxW(핸들, 내용, 제목, 박스 종류);

  • 유니코드용 메시지 박스이기 때문에 앞에 L을 붙여야 함

경고창 띄우기

main.cpp

#include "ErrorLogger.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 cCmdShow)
{
	HRESULT hr = E_INVALIDARG; // 올바르지 않은 매개 변수

	ErrorLogger::Log(hr, "FAILURE");

	return 0;
}

profile
SSAFY 9기

0개의 댓글