0x001 Programming/01. C | C++
[Example] 예외 처리
KimSangLab
2017. 12. 29. 15:04
#include <windows.h> #include <tchar.h> #include <stdio.h> #include <stdlib.h> #include <stdarg.h> #include <malloc.h> #include <io.h> #include <process.h> #define MAX_OPTIONS 20 #define MAX_ARG 1000 #define MAX_COMMAND_LINE MAX_PATH+50 #define MAX_PATH_LONG 32767 #define MAX_NAME 256 #ifdef _UNICODE #define _tstrrchr wcsrchr #else #define _tstrrchr strrchr #endif #ifdef _UNICODE #define _tstrstr wcsstr #else #define _tstrstr strstr #endif #ifdef _UNICODE #define _memtchr wmemchr #else #define _memtchr memchr #endif VOID ReportError (LPCTSTR userMessage, DWORD exitCode, BOOL printErrorMessage); VOID ReportException (LPCTSTR userMessage, DWORD exceptionCode); int _tmain(int argc, LPTSTR argv[]) { HANDLE hIn = INVALID_HANDLE_VALUE, hOut = INVALID_HANDLE_VALUE; DWORD nXfer, iFile, j; CHAR outFileName[256] = {0x0, }, *pBuffer = NULL; OVERLAPPED ov = {0, 0, 0, 0, NULL}; LARGE_INTEGER fSize; for( iFile = 1; iFile < argc; iFile++) { __try { if( _tcslen(argv[iFile]) > 250 ) { ReportException(_T("The File name is Too Long"), 1); } _stprintf(outFileName, "UC_%s", argv[iFile]); __try { hIn = CreateFile(argv[iFile], GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); if( hIn == INVALID_HANDLE_VALUE ) { ReportException(argv[iFile], 1); } if( !GetFileSizeEx(hIn, &fSize) || fSize.HighPart > 0) { ReportException(_T("This file is to Large. \n"), 1); } hOut = CreateFile(outFileName, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_NEW, 0, NULL); if( hOut == INVALID_HANDLE_VALUE ) { ReportException(outFileName, 1); } pBuffer = ( CHAR * ) malloc(fSize.LowPart); if( pBuffer == NULL ) ReportException(_T("Memory allocation error \n"), 1); if( !ReadFile(hIn, pBuffer, fSize.LowPart, &nXfer, NULL ) || (nXfer != fSize.LowPart) ) { ReportException(_T("ReadFile error \n"), 1); } for(j = 0; j < fSize.LowPart; j++) { if (isalpha(pBuffer[j])) pBuffer[j] = toupper(pBuffer[j]); } if( !WriteFile(hOut, pBuffer, fSize.LowPart, &nXfer, NULL) || (nXfer != fSize.LowPart)) { ReportException(_T("WriteFile Error \n"), 1); } } __finally { if( pBuffer != NULL ) { free(pBuffer); pBuffer = NULL; } if( hIn != INVALID_HANDLE_VALUE ) { CloseHandle(hIn); hIn = INVALID_HANDLE_VALUE; } if( hOut != INVALID_HANDLE_VALUE ) { CloseHandle(hOut); hOut = INVALID_HANDLE_VALUE; } _tcscpy(outFileName, _T("")); } } __except (EXCEPTION_EXECUTE_HANDLER) { _tprintf(_T("Error Processing File %s \n"), argv[iFile]); DeleteFile(outFileName); } } return 0; } VOID ReportException (LPCTSTR userMessage, DWORD exceptionCode) { if (lstrlen (userMessage) > 0) ReportError (userMessage, 0, TRUE); if (exceptionCode != 0) RaiseException ( (0x0FFFFFFF & exceptionCode) | 0xE0000000, 0, 0, NULL); return; } VOID ReportError (LPCTSTR userMessage, DWORD exitCode, BOOL printErrorMessage) { DWORD eMsgLen, errNum = GetLastError (); LPTSTR lpvSysMsg; _ftprintf (stderr, _T("%s\n"), userMessage); if (printErrorMessage) { eMsgLen = FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, errNum, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpvSysMsg, 0, NULL); if (eMsgLen > 0) { _ftprintf (stderr, _T("%s\n"), lpvSysMsg); } else { _ftprintf (stderr, _T("Last Error Number; %d.\n"), errNum); } if (lpvSysMsg != NULL) LocalFree (lpvSysMsg); } if (exitCode > 0) ExitProcess (exitCode); return; }
출처 : Windows 시스템 프로그래밍 윈도우즈 API 핵심 바이블