#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 핵심 바이블