Windows

GetLastError 문자열로 출력하기

bitcoder 2022. 2. 25. 22:11
728x90

윈도우환경에서 프로그램을 개발하다보면 피치 못하게 수없이 에러 상황을 겪게 됩니다.

 

그러한 에러 상황에서는 이유를 알아내야 합니다.

 

이럴 때 사용할 수 있는 함수가 바로 GetLastError()입니다.

 

하지만 이 함수의 결과는 바로 알아보기 힘든 숫자입니다.

 

이 글에서는 GetLastError()가 반환하는 숫자에 대해,

 

설명적인 문자열로 반환해주는 함수와 출력해주는 함수의 코드를 소개합니다.

 

소스코드는 다음과 같습니다.

#include <windows.h>
#include <stdio.h>

char* GetLastErrorAsString()
{
	DWORD dwLastError = GetLastError();
	if (0 == dwLastError)
		return NULL;

	char* szMessageBuffer = NULL;
	size_t size = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER
		| FORMAT_MESSAGE_FROM_SYSTEM
		| FORMAT_MESSAGE_IGNORE_INSERTS,
		NULL, dwLastError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
		(LPSTR)&szMessageBuffer, 0, NULL);

	// NOTE : szMessageBuffer must be freed after use
	return szMessageBuffer;
}

void PrintLastErrorString()
{
	LPSTR lpMessageBuffer = NULL;
	lpMessageBuffer = GetLastErrorAsString();
	if (NULL == lpMessageBuffer)
		return;

	printf("%s", lpMessageBuffer);
	LocalFree(lpMessageBuffer);
}

//[[ code for unit test
int main(int argc, char** argv)
{
	FILE* fp = NULL;
	fopen_s(&fp, "C:\\a_non_existent_file.txt", "r");
	PrintLastErrorString();

	fopen_s(&fp, "C:\\windows\\system32\\notepad.exe", "r");
	PrintLastErrorString();

	return EXIT_SUCCESS;
}
//]] code for unit test

 

실행결과는 다음과 같습니다.

C:\Users\Admin\source\repos\GetLastError\Release>GetLastError.exe
지정된 파일을 찾을 수 없습니다.

C:\Users\Admin\source\repos\GetLastError\Release>

 

아래에 프로젝트 파일을 첨부합니다.

GetLastError.zip
0.01MB

 

728x90

'Windows' 카테고리의 다른 글

visual studio 2022 언어 설정  (0) 2022.03.05
관리자 권한으로 cmd창 실행하기  (0) 2022.03.04
windows service install/uninstall  (0) 2022.03.04
Windows Application FindProcessId C/C++ Code  (0) 2022.02.25
배치스크립트 파일읽기  (0) 2022.02.25