Initial commit: ROW Client source code

Game client codebase including:
- CharacterActionControl: Character and creature management
- GlobalScript: Network, items, skills, quests, utilities
- RYLClient: Main client application with GUI and event handlers
- Engine: 3D rendering engine (RYLGL)
- MemoryManager: Custom memory allocation
- Library: Third-party dependencies (DirectX, boost, etc.)
- Tools: Development utilities

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-29 16:24:34 +09:00
commit e067522598
5135 changed files with 1745744 additions and 0 deletions

View File

@@ -0,0 +1,123 @@
///////////////////////////////////////////////////////////////////////////
// DirDialog.cpp: implementation of the CDirDialog class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "DirDialog.h"
#include "shlobj.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
// Callback function called by SHBrowseForFolder's browse control
// after initialization and when selection changes
static int __stdcall BrowseCtrlCallback(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
CDirDialog* pDirDialogObj = (CDirDialog*)lpData;
if (uMsg == BFFM_INITIALIZED && !pDirDialogObj->m_strSelDir.IsEmpty())
{
::SendMessage(hwnd, BFFM_SETSELECTION, TRUE, (LPARAM)(LPCTSTR)(pDirDialogObj->m_strSelDir));
}
else // uMsg == BFFM_SELCHANGED
{
}
return 0;
}
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CDirDialog::CDirDialog()
{
}
CDirDialog::~CDirDialog()
{
}
int CDirDialog::DoBrowse( HWND hWnd )
{
LPMALLOC pMalloc;
if (SHGetMalloc (&pMalloc)!= NOERROR)
{
return 0;
}
BROWSEINFO bInfo;
LPITEMIDLIST pidl;
ZeroMemory ( (PVOID) &bInfo,sizeof (BROWSEINFO));
if (!m_strInitDir.IsEmpty ())
{
OLECHAR olePath[MAX_PATH];
ULONG chEaten;
ULONG dwAttributes;
HRESULT hr;
LPSHELLFOLDER pDesktopFolder;
//
// Get a pointer to the Desktop's IShellFolder interface.
//
if (SUCCEEDED(SHGetDesktopFolder(&pDesktopFolder)))
{
//
// IShellFolder::ParseDisplayName requires the file name be in Unicode.
//
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, m_strInitDir.GetBuffer(MAX_PATH), -1,
olePath, MAX_PATH);
m_strInitDir.ReleaseBuffer (-1);
//
// Convert the path to an ITEMIDLIST.
//
hr = pDesktopFolder->ParseDisplayName(NULL,
NULL,
olePath,
&chEaten,
&pidl,
&dwAttributes);
if (FAILED(hr))
{
pMalloc ->Free (pidl);
pMalloc ->Release ();
return 0;
}
bInfo.pidlRoot = pidl;
}
}
bInfo.hwndOwner = NULL;
bInfo.pszDisplayName = m_strPath.GetBuffer (MAX_PATH);
bInfo.lpszTitle = (m_strTitle.IsEmpty()) ? "Open":m_strTitle;
bInfo.ulFlags = BIF_RETURNFSANCESTORS|BIF_RETURNONLYFSDIRS;
bInfo.lpfn = BrowseCtrlCallback; // address of callback function
bInfo.lParam = (LPARAM)this; // pass address of object to callback function
if ((pidl = ::SHBrowseForFolder(&bInfo)) == NULL)
{
return 0;
}
m_strPath.ReleaseBuffer();
m_iImageIndex = bInfo.iImage;
if (::SHGetPathFromIDList(pidl,m_strPath.GetBuffer(MAX_PATH)) == FALSE)
{
pMalloc->Free(pidl);
pMalloc->Release();
return 0;
}
m_strPath.ReleaseBuffer();
pMalloc->Free(pidl);
pMalloc->Release();
return 1;
}

View File

@@ -0,0 +1,29 @@
////////////////////////////////////////////////////////////////////////
// DirDialog.h: interface for the CDirDialog class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_DIRDIALOG_H__62FFAC92_1DEE_11D1_B87A_0060979CDF6D__INCLUDED_)
#define AFX_DIRDIALOG_H__62FFAC92_1DEE_11D1_B87A_0060979CDF6D__INCLUDED_
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
class CDirDialog
{
public:
CDirDialog() ;
virtual ~CDirDialog() ;
int DoBrowse( HWND hWnd ) ;
CString m_strPath ;
CString m_strInitDir ;
CString m_strSelDir ;
CString m_strTitle ;
int m_iImageIndex ;
};
#endif // !defined(AFX_DIRDIALOG_H__62FFAC92_1DEE_11D1_B87A_0060979CDF6D__INCLUDED_)

View File

@@ -0,0 +1,913 @@
#include "StdAfx.h"
#include ".\dumpfileparser.h"
#include ".\resource.h"
#include ".\DumpStatisticsDlg.h"
struct CompareVectorfVersion
{
bool operator () (const CDumpLog* lhs, const CDumpLog* rhs) const
{
int cnt = 0;
if( lhs->fVersion == rhs->fVersion )
{
if( (cnt = strcmp( lhs->szFileName, rhs->szFileName ) ) == 0 )
{
return (strcmp( lhs->szFaultAddress, rhs->szFaultAddress ) < 0 );
}
else
return ( cnt < 0);
}
return lhs->fVersion < rhs->fVersion;
}
};
struct CompareVectorFaultAddress
{
bool operator () (const LPFAULTLIST lhs, const LPFAULTLIST rhs) const
{
if( lhs->dwVersion == rhs->dwVersion )
{
return (strcmp( lhs->szFileName, rhs->szFileName ) < 0 );
}
return lhs->dwVersion < rhs->dwVersion ;
}
};
CDumpFileParser::CDumpFileParser( CDumpStatisticsDlg* pDlg )
{
m_pDlg = pDlg ;
CWnd* pWnd = m_pDlg->GetDlgItem( IDC_DUMPFILE ) ;
pWnd->SetWindowText( " " ) ;
m_pDlg->UpdateData() ;
m_pDlg->UpdateData( FALSE ) ;
m_uiDumpSize = 0 ;
}
CDumpFileParser::~CDumpFileParser(void)
{
std::vector< LPDUMPDIRECTORYINFO >::iterator iterVer = m_vecDumpDirectoryInfo.begin() ;
while( iterVer != m_vecDumpDirectoryInfo.end() )
{
LPDUMPDIRECTORYINFO lpDumpDirectoryInfo = ( *iterVer ) ;
std::vector< LPFILENAME >::iterator iterFile = lpDumpDirectoryInfo->vecDumpFileInfo.begin() ; // Vector Date Direcoty
while( iterFile != lpDumpDirectoryInfo->vecDumpFileInfo.end() )
{
if( (*iterFile ) )
{
delete ( *iterFile );
( *iterFile ) = NULL;
}
iterFile++;
}
lpDumpDirectoryInfo->vecDumpFileInfo.clear() ;
if ( ( *iterVer ) )
{
delete ( *iterVer ) ;
( *iterVer ) = NULL ;
}
++ iterVer ;
}
m_vecDumpDirectoryInfo.clear() ;
}
//----------------------------------------------------------------------------
// 하위 디렉토리를 전부 검색하여 파일을 덤프 파일 목록과 디렉토리 목록을 만든다.
//----------------------------------------------------------------------------
VOID
CDumpFileParser::FindDumpDirectory()
{
m_uiDumpSize = 0;
FindDumpDirectory( m_szCurrentDirectory );
CWnd* pProgressWnd = m_pDlg->GetDlgItem( IDC_DUMPPROGRESS ) ;
pProgressWnd->SendMessage( PBM_SETRANGE, 0, MAKELPARAM( 0,m_uiDumpSize ) ) ;
pProgressWnd->SendMessage( PBM_SETPOS, 0, 0 ) ;
}
//----------------------------------------------------------------------------
// 해당 디렉토리에서의 파일 찾기
//----------------------------------------------------------------------------
VOID
CDumpFileParser::FindDumpFile( LPDUMPDIRECTORYINFO pDirectoryInfo )
{
HANDLE hSrch ;
WIN32_FIND_DATA wfd ;
BOOL bResult = TRUE ;
CHAR szDirectory[ MAX_PATH ] ;
CHAR szTempDirectory[ MAX_PATH ] ;
UINT uiDirectoryNum = 0 ;
strcpy( szDirectory, pDirectoryInfo->szDirectory ) ;
strcpy( szTempDirectory, pDirectoryInfo->szDirectory ) ;
strcat( szDirectory, "\\*.txt" ) ;
hSrch = FindFirstFile( szDirectory, &wfd ) ;
if ( hSrch == INVALID_HANDLE_VALUE )
{
return ;
}
while( bResult )
{
if ( wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
{
if ( !strcmp( wfd.cFileName, "." ) )
{
bResult = FindNextFile( hSrch, &wfd ) ;
continue ;
}
if ( !strcmp( wfd.cFileName, ".." ) )
{
bResult = FindNextFile( hSrch, &wfd ) ;
continue ;
}
}
else
{
wsprintf( szTempDirectory, "%s\\%s", pDirectoryInfo->szDirectory, wfd.cFileName ) ;
LPFILENAME lpFileName ;
lpFileName = new FILENAME ;
strcpy( lpFileName->szFileName, szTempDirectory ) ;
pDirectoryInfo->vecDumpFileInfo.push_back( lpFileName ) ;
m_uiDumpSize += 1;
}
bResult = FindNextFile( hSrch, &wfd ) ;
}
}
//----------------------------------------------------------------------------
// 하위 디렉토리를 전부 검색하여 파일을 덤프 파일 목록과 디렉토리 목록을 만든다.
//----------------------------------------------------------------------------
VOID
CDumpFileParser::FindDumpDirectory( const char* path )
{
HANDLE hSrch ;
WIN32_FIND_DATA wfd ;
BOOL bResult = TRUE ;
CHAR szDirectory[ MAX_PATH ] ;
CHAR szTempDirectory[ MAX_PATH ] ;
strcpy( szDirectory, path ) ;
strcpy( szTempDirectory, path ) ;
strcat( szDirectory, "\\*.*" ) ;
hSrch = FindFirstFile( szDirectory, &wfd ) ;
if ( hSrch == INVALID_HANDLE_VALUE )
{
return ;
}
while( bResult )
{
if ( wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
{
if ( !strcmp( wfd.cFileName, "." ) )
{
bResult = FindNextFile( hSrch, &wfd ) ;
continue ;
}
if ( !strcmp( wfd.cFileName, ".." ) )
{
bResult = FindNextFile( hSrch, &wfd ) ;
continue ;
}
if ( !strcmp( wfd.cFileName, "sort") ) //sort 디렉토리는 패스
{
bResult = FindNextFile( hSrch, &wfd ) ;
continue;
}
LPDUMPDIRECTORYINFO pDumpDirectory ;
pDumpDirectory = new DUMPDIRECTORYINFO ;
wsprintf( szTempDirectory, "%s\\%s", path, wfd.cFileName ) ;
strcpy( pDumpDirectory->szDirectory, szTempDirectory ) ;
FindDumpFile( pDumpDirectory );
m_vecDumpDirectoryInfo.push_back( pDumpDirectory );
FindDumpDirectory( szTempDirectory );
}
bResult = FindNextFile( hSrch, &wfd ) ;
}
FindClose( hSrch ) ;
}
/*
//-----------------------------------------------------------------
// Date디렉토리를 찾는다.
//-----------------------------------------------------------------
UINT CDumpFileParser::FindDumpDateDirectory( LPDUMPDIRECTORYINFO lpDumpInfo )
{
HANDLE hSrch ;
WIN32_FIND_DATA wfd ;
BOOL bResult = TRUE ;
CHAR szDirectory[ MAX_PATH ] ;
CHAR szTempDirectory[ MAX_PATH ] ;
UINT uiDirectoryNum = 0 ;
strcpy( szDirectory, lpDumpInfo->szVerDirectory ) ;
strcpy( szTempDirectory, lpDumpInfo->szVerDirectory ) ;
strcat( szDirectory, "\\*.*" ) ;
hSrch = FindFirstFile( szDirectory, &wfd ) ;
if ( hSrch == INVALID_HANDLE_VALUE )
{
return 0 ;
}
while( bResult )
{
if ( wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
{
if ( !strcmp( wfd.cFileName, "." ) )
{
bResult = FindNextFile( hSrch, &wfd ) ;
continue ;
}
if ( !strcmp( wfd.cFileName, ".." ) )
{
bResult = FindNextFile( hSrch, &wfd ) ;
continue ;
}
wsprintf( szTempDirectory, "%s\\%s", lpDumpInfo, wfd.cFileName ) ;
LPDUMPFILEINFO lpTmpDumpFileInfo ;
lpTmpDumpFileInfo = new DUMPFILEINFO ;
strcpy( lpTmpDumpFileInfo->szDateDirectory, szTempDirectory ) ;
lpDumpInfo->vecDumpFileInfo.push_back( lpTmpDumpFileInfo ) ;
lpTmpDumpFileInfo->uiDirectoryNum = FindDumpFile( lpTmpDumpFileInfo ) ;
m_uiDumpSize += lpTmpDumpFileInfo->uiDirectoryNum ;
++ uiDirectoryNum ;
}
bResult = FindNextFile( hSrch, &wfd ) ;
}
CWnd* pProgressWnd = m_pDlg->GetDlgItem( IDC_DUMPPROGRESS ) ;
pProgressWnd->SendMessage( PBM_SETRANGE, 0, MAKELPARAM( 0,m_uiDumpSize ) ) ;
pProgressWnd->SendMessage( PBM_SETPOS, 0, 0 ) ;
return uiDirectoryNum ;
}
//-----------------------------------------------------------------
// Date디렉토리 안의 모든 파일들을 찾는다.
//-----------------------------------------------------------------
UINT CDumpFileParser::FindDumpFile( LPDUMPFILEINFO lpDumpFileInfo )
{
HANDLE hSrch ;
WIN32_FIND_DATA wfd ;
BOOL bResult = TRUE ;
CHAR szDirectory[ MAX_PATH ] ;
CHAR szTempDirectory[ MAX_PATH ] ;
UINT uiDirectoryNum = 0 ;
strcpy( szDirectory, lpDumpFileInfo->szDateDirectory ) ;
strcpy( szTempDirectory, lpDumpFileInfo->szDateDirectory ) ;
strcat( szDirectory, "\\*.txt" ) ;
hSrch = FindFirstFile( szDirectory, &wfd ) ;
if ( hSrch == INVALID_HANDLE_VALUE )
{
return 0 ;
}
while( bResult )
{
if ( wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
{
if ( !strcmp( wfd.cFileName, "." ) )
{
bResult = FindNextFile( hSrch, &wfd ) ;
continue ;
}
if ( !strcmp( wfd.cFileName, ".." ) )
{
bResult = FindNextFile( hSrch, &wfd ) ;
continue ;
}
}
else
{
wsprintf( szTempDirectory, "%s\\%s", lpDumpFileInfo->szDateDirectory, wfd.cFileName ) ;
LPFILENAME lpFileName ;
lpFileName = new FILENAME ;
strcpy( lpFileName->szFileName, szTempDirectory ) ;
lpDumpFileInfo->vecFileName.push_back( lpFileName ) ;
++ uiDirectoryNum ;
}
bResult = FindNextFile( hSrch, &wfd ) ;
}
return uiDirectoryNum ;
}
*/
//-----------------------------------------------------------------------------------------------
VOID CDumpFileParser::LoadDumpFile()
{
HRESULT hr = S_OK ;
FILE* pStream = NULL ;
char strRead[MAX_PATH] ;
char tempDirectory[MAX_PATH] ;
int Count = 0 ;
::GetCurrentDirectory( MAX_PATH, tempDirectory );
CProgressCtrl* pProgressWnd = (CProgressCtrl*)(m_pDlg->GetDlgItem( IDC_DUMPPROGRESS ) );
CWnd* pWnd = m_pDlg->GetDlgItem( IDC_DUMPFILE ) ;
LPDUMPMETADATA lpMetaData ;
lpMetaData = new DUMPMETADATA ;
std::vector< LPDUMPDIRECTORYINFO >::iterator iterVer = m_vecDumpDirectoryInfo.begin() ;
while( iterVer != m_vecDumpDirectoryInfo.end() )
{
LPDUMPDIRECTORYINFO lpDumpDirectoryInfo = ( *iterVer ) ;
if( ::SetCurrentDirectory( lpDumpDirectoryInfo->szDirectory ) )
{
std::vector< LPFILENAME >::iterator iterData = lpDumpDirectoryInfo->vecDumpFileInfo.begin();
while( iterData != lpDumpDirectoryInfo->vecDumpFileInfo.end() )
{
LPFILENAME lpFileName = ( *iterData ) ;
static CHAR szTemp[ MAX_PATH ] ;
sprintf( szTemp, "%s\n", lpFileName ) ;
OutputDebugString( szTemp ) ;
pWnd->SetWindowText( szTemp ) ;
pProgressWnd->SetPos( Count );
if ( ( pStream = fopen( lpFileName->szFileName, "rt" ) ) == NULL )
{
continue ;
}
lpMetaData->ClearData();
strcpy( lpMetaData->szFileName, lpFileName->szFileName );
while(fgets(strRead, MAX_PATH - 1, pStream))
{
strRead[MAX_PATH - 1] = 0;
if ( FAILED( CheckLine( strRead, lpMetaData ) ) )
{
CheckMoreDump( pStream, lpMetaData );
break ;
}
}
if( CopyFileExt( lpMetaData, lpFileName->szFileName ) )
{
m_DumpReport.PushFaultLog ( lpMetaData );
}
fclose( pStream );
Count++ ;
iterData++;
}
}
iterVer++;
}
delete lpMetaData;
pProgressWnd->SetPos( Count ) ;
pWnd->SetWindowText( "리포트 파일 생성중" ) ;
::SetCurrentDirectory( tempDirectory );
m_DumpReport.Write2File( "report.txt" );
pWnd->SetWindowText( "End" ) ;
pProgressWnd->SetPos( 0 ) ;
}
HRESULT CDumpFileParser::CheckLine( CHAR* strLine, LPDUMPMETADATA lpMetaData )
{
CHAR seps[] = " ,\t\n[];" ;
CHAR *token, strCommand[ MAX_PATH ], strName[ MAX_PATH ] ;
CHAR strTemp[ 256 ];
strncpy( strTemp, strLine, 256);
token = strtok( strLine, seps ) ;
if ( token )
{
strcpy( strCommand, token ) ;
token = strlwr( strCommand ) ;
// 서버 이름
if (!strcmp(token, "server"))
{
BOOL bExcept = FALSE;
token = strtok(NULL, seps);
if (token)
{
strncpy( strName, token, sizeof(CHAR)*32 ) ;
token = strtok( NULL, seps ) ;
if ( token )
{
if (!strcmp(token, "Test"))
{
strncpy( lpMetaData->szServerName, "Test Server Version", sizeof(CHAR)*32) ;
}
}
else
return E_FAIL;
}
else
return E_FAIL;
return S_OK;
}
// 클라이언트 버전
if (!strcmp(token, "client"))
{
BOOL bExcept = FALSE;
token = strtok(NULL, seps);
if (token)
{
token = strtok( NULL, seps ) ;
token = strtok( NULL, seps ) ;
if ( token )
{
lpMetaData->fVersion = atof( token ) ;
if( lpMetaData->fVersion > 0 )
strncpy( lpMetaData->szVersion , token, sizeof(CHAR)*8 );
else
{
strcpy( lpMetaData->szVersion , "0.00" );
lpMetaData->fVersion = 0;
}
}
else
return E_FAIL;
}
else
return E_FAIL;
return S_OK;
}
// exception address
if (!strcmp(token, "exception"))
{
BOOL bExcept = FALSE;
token = strtok(NULL, seps);
if (token)
{
token = strtok( NULL, seps ) ;
if ( token )
{
memcpy( lpMetaData->byException, token, 8 ) ;
lpMetaData->byException[ 8 ] = 0;
}
else
return E_FAIL;
}
else
return E_FAIL;
return S_OK;
}
// Fault address
if (!strcmp(token, "fault"))
{
BOOL bExcept = FALSE;
token = strtok(NULL, seps);
if (token)
{
token = strtok( NULL, seps ) ;
if ( token )
{
memcpy( lpMetaData->byFaultAddress[ lpMetaData->nFaultCnt ], token, 8 ) ;
lpMetaData->byFaultAddress[ lpMetaData->nFaultCnt ][ 8 ] = 0;
lpMetaData->nFaultCnt += 1;
return E_FAIL;
}
else
return E_FAIL;
}
else
return E_FAIL;
return S_OK;
}
//AvailableVirtualMemory
if(!strcmp(token, "availablevirtualmemory"))
{
token = strtok(NULL, seps);
if (token)
{
token = strtok( NULL, seps ) ;
if ( token )
{
strncpy( lpMetaData->szAvailabelVirtualMemory , token, sizeof(CHAR)*15 );
}
}
return S_OK;
}
if(!strcmp(token, "totalphysicalmemory") )
{
token = strtok(NULL, seps);
if (token)
{
token = strtok( NULL, seps ) ;
if ( token )
{
strncpy( lpMetaData->szTotalPhysicalMemory , token, sizeof(CHAR)*15 );
}
}
return S_OK;
}
if(!strcmp(token, "adapterram") )
{
token = strtok(NULL, seps);
if (token)
{
token = strtok( NULL, seps ) ;
if ( token )
{
strncpy( lpMetaData->szAdapterRAM , token, sizeof(CHAR)*15 );
}
}
return S_OK;
}
if(!strcmp(token, "videoprocessor") )
{
int lenLeft ;
int lenPrev ;
lenPrev = strlen( strLine );
lenLeft = strlen( strTemp ) - lenPrev;
if( lenLeft > 7 )
{
strncpy( lpMetaData->szVideoProcessor, &strTemp[lenPrev+4], sizeof(CHAR)*(lenLeft-4-3) );
lpMetaData->szVideoProcessor[ lenLeft-4-3 ] = 0 ;
}
return S_OK;
}
//Available Memory
if(!strcmp(token, "available") )
{
token = strtok(NULL, seps);
if (token)
{
token = strtok( NULL, seps ) ;
if ( token )
{
token = strtok(NULL, seps);
if( token )
{
strncpy( lpMetaData->szAvailableMemory, token, sizeof(CHAR)*15 );
}
}
}
return S_OK;
}
}
return S_OK ;
}
HRESULT CDumpFileParser::CheckMoreDump( FILE* pFile, LPDUMPMETADATA lpMetaData )
{
CHAR strRead[MAX_PATH];
CHAR seps[] = " ,\t\n" ;
CHAR *token ;
while(fgets(strRead, MAX_PATH - 1, pFile))
{
strRead[MAX_PATH - 1] = 0;
strlwr( strRead );
if( strstr( strRead, "address" ) )
{
if( strstr( strRead, "frame" ) )
{
while(fgets(strRead, MAX_PATH - 1, pFile))
{
strlwr( strRead );
if( strstr( strRead, "client.exe" ) )
{
token = strtok( strRead, seps ) ;
if ( token )
{
memcpy( lpMetaData->byFaultAddress[ lpMetaData->nFaultCnt ], token, 8 ) ;
lpMetaData->nFaultCnt += 1;
if( lpMetaData->nFaultCnt >= 50 ) //갯수 제한.
{
return S_OK;
}
}
token = strtok(NULL, seps);
}
}
return S_OK;
}
}
}
return S_OK ;
}
const char*
// 해당 덤프하는 디렉토리를 만들고 해당 디렉토리 위치를 리턴한다.
CDumpFileParser::MakeDirectory( LPDUMPMETADATA lpMetaData, int nCnt )
{
static CHAR tempDirectory[ MAX_PATH ];
CHAR buff[ MAX_PATH ];
CHAR temp[ MAX_PATH ];
if( lpMetaData->nFaultCnt > nCnt )
{
::GetCurrentDirectory( MAX_PATH, temp );
if( !::SetCurrentDirectory( m_szCopyDirectory ) )
{
return NULL;
}
//sprintf( buff, "%.2f", lpMetaData->fVersion );
strcpy( buff, lpMetaData->szVersion );
::CreateDirectory( buff, NULL );
sprintf( tempDirectory, "%s\\%s", m_szCopyDirectory, lpMetaData->szVersion );
if( !::SetCurrentDirectory( tempDirectory) )
{
::SetCurrentDirectory( temp );
return NULL;
}
memset( buff, 0, sizeof( CHAR ) * MAX_PATH );
strncpy( buff, lpMetaData->byFaultAddress[ nCnt ], sizeof( CHAR ) * 8 );
::CreateDirectory( buff, NULL );
if( !::SetCurrentDirectory( buff ) )
{
::SetCurrentDirectory( temp );
return NULL;
}
::SetCurrentDirectory( temp );
sprintf( tempDirectory, "%s\\%s\\%s", m_szCopyDirectory, lpMetaData->szVersion, buff ); // 버젼/뻗은 주소
return tempDirectory ;
}
return NULL;
}
BOOL
CDumpFileParser::CopyFileExt( LPDUMPMETADATA lpMetaData, LPSTR lpszFileName )
{
if( !lpMetaData )
return FALSE;
CHAR szDumpDirectory[ MAX_PATH ] ;
CHAR szTemp[ 9 ] ;
CHAR filename[ MAX_PATH ];
CHAR seps[] = "\\" ;
CHAR *token;
const char* path;
memcpy( szTemp, lpMetaData->byFaultAddress[0], 8 ) ;
szTemp[ 8 ] = 0 ;
strcpy( szDumpDirectory, lpszFileName );
token = strtok( szDumpDirectory, seps ) ;
while( token )
{
strcpy( filename, token );
token = strtok( NULL, seps );
}
int i ;
for( i = 0 ; i < lpMetaData->nFaultCnt ; i++ )
{
path = MakeDirectory( lpMetaData, i );
if( !path )
continue;
sprintf( szDumpDirectory, "%s\\%s", path, filename );
if ( !CopyFile( lpszFileName, szDumpDirectory, FALSE ) )
{
return FALSE;
}
INT iLen = strlen( lpszFileName ) ;
lpszFileName[ iLen - 1] = 'p' ;
lpszFileName[ iLen - 2 ] = 'm' ;
lpszFileName[ iLen - 3 ] = 'd' ;
iLen = strlen( filename ) ;
filename[ iLen - 1] = 'p' ;
filename[ iLen - 2 ] = 'm' ;
filename[ iLen - 3 ] = 'd' ;
sprintf( szDumpDirectory, "%s\\%s", path, filename );
if ( !CopyFile( lpszFileName, szDumpDirectory, FALSE ) )
{
return FALSE;
}
iLen = strlen( lpszFileName ) ;
lpszFileName[ iLen - 1] = 't' ;
lpszFileName[ iLen - 2 ] = 'x' ;
lpszFileName[ iLen - 3 ] = 't' ;
iLen = strlen( filename ) ;
filename[ iLen - 1] = 't' ;
filename[ iLen - 2 ] = 'x' ;
filename[ iLen - 3 ] = 't' ;
}
return TRUE;
}
BOOL
CDumpReport::Write2File( const char* filename )
{
FILE* pFile;
int nCnt;
std::vector< LPFAULTLIST > vecHotList;
pFile = fopen( filename, "w" );
std::sort(vecDumpFile.begin(), vecDumpFile.end(), CompareVectorfVersion());
std::sort(vecFaultList.begin(), vecFaultList.end(), CompareVectorFaultAddress() );
if( pFile )
{
fprintf( pFile,"오류주소\t메모리(KB)\t사용가능한메모리(KB)\t비디오램(KB)\t비디오프로세서\t버젼\t파일이름\n");
std::vector< CDumpLog* >::iterator iterFile;
for( iterFile = vecDumpFile.begin() ; iterFile !=vecDumpFile.end() ; iterFile++ )
{
if( *iterFile )
{
(*iterFile)->Print2File( pFile );
}
}
fprintf( pFile,"--------------------------------------------------------------------------------\n");
fprintf( pFile,"\n\n\n");
fprintf( pFile,"--------------------------------------------------------------------------------\n");
std::vector< LPFAULTLIST >::iterator iterList;
for( iterList = vecFaultList.begin() ; iterList !=vecFaultList.end() ; iterList++ )
{
nCnt = 0;
for( iterFile = vecDumpFile.begin() ; iterFile !=vecDumpFile.end() ; iterFile++ )
{
if( (*iterFile)->fVersion == (*iterList)->dwVersion )
{
if( strcmp( (*iterFile)->szFaultAddress, (*iterList)->szFileName ) == 0 )
{
nCnt++;
}
}
}
if( nCnt > 0 )
{
fprintf( pFile,"버젼%.2f\t주소:[ %s ] \t%d개\n", (*iterList)->dwVersion, (*iterList)->szFileName, nCnt );
if( nCnt > 20 )
vecHotList.push_back( (*iterList) );
}
}
fprintf( pFile,"--------------------------------------------------------------------------------\n");
fprintf( pFile,"\n\n\n");
fprintf( pFile,"------------------------Hot----List---------------------------------------------\n");
for( iterList = vecHotList.begin() ; iterList !=vecHotList.end() ; iterList++ )
{
fprintf( pFile,"버젼%.2f\t주소:[ %s ] \n", (*iterList)->dwVersion, (*iterList)->szFileName );
}
fprintf( pFile,"\n\n----E-N-D----\n");
fclose( pFile );
vecHotList.clear();
return TRUE;
}
return FALSE;
}
VOID
CDumpReport::PushFaultLog( LPDUMPMETADATA lpMeta )
{
std::vector< CDumpLog* >::iterator iterFile;
for( int i = 0 ; i < lpMeta->nFaultCnt ; i++ )
{
bool bExist = false;
for( iterFile = vecDumpFile.begin(); iterFile != vecDumpFile.end(); iterFile++ )
{
if( (*iterFile)->fVersion == lpMeta->fVersion )
{
if( strcmp( (*iterFile)->szFileName, lpMeta->szVersion ) == 0 )
{
if( strcmp( (*iterFile)->szFaultAddress, lpMeta->byFaultAddress[i]) == 0 )
{
bExist = true;
break;
}
}
}
}
if( bExist )
continue;
CDumpLog* pLog;
pLog = new CDumpLog();
pLog->fVersion = lpMeta->fVersion; // 버전
strcpy( pLog->szFaultAddress, lpMeta->byFaultAddress[ i ] ); // Fault Address
strcpy( pLog->szFileName, lpMeta->szFileName ) ; // 파일명
strcpy( pLog->szVersion, lpMeta->szVersion ) ; // 버전
strcpy( pLog->szGraphicCard, lpMeta->szVideoProcessor ) ; //그래픽 카드
pLog->nBaseSystemMemory = 0; //기본 시스템 메모리
pLog->nUsedSystemMemory = 0; //사용 시스템 메모리
pLog->nBaseLocalMemory = atoi( lpMeta->szTotalPhysicalMemory ); //기본 Local 메모리
pLog->nLeftMemory = atoi( lpMeta->szAvailableMemory ); //기본 Local 메모리
pLog->nBaseAGPMemory = atoi( lpMeta->szAdapterRAM ); //기본 AGP 메모리
pLog->nBaseAGPMemory = pLog->nBaseAGPMemory / 1024 ;
pLog->nUsedAGPMemory = 0; //기본 AGP 메모리
vecDumpFile.push_back( pLog );
std::vector< LPFAULTLIST >::iterator iterList;
bExist = false;
for( iterList = vecFaultList.begin() ; iterList !=vecFaultList.end() ; iterList++ )
{
if( (*iterList)->dwVersion == pLog->fVersion )
{
if( strcmp( (*iterList)->szFileName, pLog->szFaultAddress ) == 0 )
{
bExist = true ;
break;
}
}
}
if( !bExist )
{
LPFAULTLIST pList;
pList = new FAULTLIST;
strcpy( pList->szFileName, pLog->szFaultAddress );
pList->dwVersion = pLog->fVersion;
vecFaultList.push_back( pList );
}
}
}
CDumpReport::~CDumpReport()
{
std::vector< CDumpLog* >::iterator iterFile;
for( iterFile = vecDumpFile.begin() ; iterFile !=vecDumpFile.end() ; iterFile++ )
{
if( *iterFile )
{
delete (*iterFile);
(*iterFile) = NULL;
}
}
vecDumpFile.clear();
std::vector< LPFAULTLIST >::iterator iterList;
for( iterList = vecFaultList.begin() ; iterList !=vecFaultList.end() ; iterList++ )
{
if( *iterList )
{
delete (*iterList);
(*iterList) = NULL;
}
}
vecFaultList.clear();
}
VOID
CDumpLog::Print2File( FILE* pFile )
{
if( !pFile )
return;
fprintf( pFile,"%s\t%d\t%d\t%d\t%s\t%s\t%s\n", szFaultAddress, nBaseLocalMemory, nLeftMemory, nBaseAGPMemory, szGraphicCard, szVersion, szFileName );
return;
}

View File

@@ -0,0 +1,138 @@
#pragma once
#include <vector>
#include <algorithm>
class CDumpStatisticsDlg ;
enum DUMP_FLUG
{
SERVER_NAME,
SERVER_VERSION,
EXCEPTION,
FAULT_ADDRESS
} ;
typedef struct __DUMPMETADATA
{
CHAR byFaultAddress[50][ 10 ] ; // 뻣은 주소 ㅡㅡ;
int nFaultCnt;
CHAR byException[ 10 ] ; // 익셉션 주소
CHAR szServerName[ 32 ] ; // 서버 이름
CHAR szFileName[ MAX_PATH ] ; // dump 파일명
CHAR szVersion[ 8 ] ;
CHAR szAvailabelVirtualMemory[ 15 ]; // 가상 메모리 여유분
CHAR szTotalPhysicalMemory[ 15 ]; // 실제 메모리량
CHAR szAdapterRAM[ 15 ]; // 비디오 램
CHAR szVideoProcessor[ 64 ]; // 비디오 프로세서
CHAR szAvailableMemory[ 15 ]; // 여유 메모리
DOUBLE fVersion ; // 서버 버전
__DUMPMETADATA(){ ClearData(); };
void ClearData()
{
memset( byFaultAddress, 0, sizeof( CHAR ) * 50 * 10 );
nFaultCnt = 0 ;
memset( byException, 0, sizeof( CHAR ) * 10 );
memset( szServerName, 0, sizeof( CHAR ) * 32 );
memset( szFileName, 0, sizeof( CHAR ) * MAX_PATH );
strcpy( szVersion, "0.00" );
strcpy( szAvailabelVirtualMemory, "0" );
strcpy( szTotalPhysicalMemory, "0" );
strcpy( szAdapterRAM, "0" );
strcpy( szVideoProcessor, "0" );
strcpy( szAvailableMemory, "0" );
fVersion = 0;
}
}DUMPMETADATA, *LPDUMPMETADATA ;
typedef struct __FILENAME
{
CHAR szFileName[ MAX_PATH ] ;
}FILENAME, *LPFILENAME ;
typedef struct __FAULTLIST
{
DOUBLE dwVersion;
CHAR szFileName[ MAX_PATH ] ;
}FAULTLIST, *LPFAULTLIST;
typedef struct __DUMPDIRECTORYINFO
{
CHAR szDirectory[ MAX_PATH ] ; // 해당 Direcoty
std::vector< LPFILENAME > vecDumpFileInfo ; // Vector 파일
} DUMPDIRECTORYINFO, *LPDUMPDIRECTORYINFO ;
class CDumpLog
{
public:
DOUBLE fVersion; // 버전
CHAR szFaultAddress[ MAX_PATH ]; // Fault Address
CHAR szFileName[ MAX_PATH ] ; // 파일명
CHAR szVersion[ MAX_PATH ] ; // 버전
CHAR szGraphicCard[ MAX_PATH ] ; //그래픽 카드
UINT nBaseSystemMemory; //기본 시스템 메모리
UINT nUsedSystemMemory; //사용 시스템 메모리
UINT nBaseLocalMemory; //기본 Local 메모리
UINT nLeftMemory; //기본 Local 메모리 - 남은량
UINT nBaseAGPMemory; //기본 AGP 메모리
UINT nUsedAGPMemory; //기본 AGP 메모리
public:
VOID Print2File( FILE* pFile );
CDumpLog(){};
~CDumpLog(){};
};
class CDumpReport
{
private:
std::vector< CDumpLog* > vecDumpFile; // 덤프 정보
std::vector< LPFAULTLIST > vecFaultList;
VOID AddFaultList( const char* szFault );
public:
BOOL Write2File( const char* filename );
CDumpReport(){};
~CDumpReport();
VOID PushFaultLog( LPDUMPMETADATA lpMeta );
};
class CDumpFileParser
{
private :
CHAR m_szCurrentDirectory[ MAX_PATH ] ; // 현재 디렉토리
CHAR m_szCopyDirectory[ MAX_PATH ] ; // 순서에 맞게 복사해서 넣는 위치
std::vector< LPDUMPDIRECTORYINFO > m_vecDumpDirectoryInfo ;
UINT m_uiDumpSize ;
CDumpStatisticsDlg* m_pDlg ;
CDumpReport m_DumpReport;
protected:
VOID FindDumpDirectory( const char* path ) ; //하위 디렉토리를 전부 검색하여 파일을 덤프 파일 목록과 디렉토리 목록을 만든다.
VOID FindDumpFile( LPDUMPDIRECTORYINFO pDirectoryInfo ) ; // 해당 디렉토리에서의 파일 찾기
public :
CDumpFileParser( CDumpStatisticsDlg* pDlg ) ;
~CDumpFileParser(void);
VOID SetDumpDirectory( LPCTSTR lpszDirectory )
{
strcpy( m_szCurrentDirectory, lpszDirectory ) ;
sprintf( m_szCopyDirectory,"%s\\sort", m_szCurrentDirectory ) ;
::SetCurrentDirectory( m_szCurrentDirectory );
::CreateDirectory( "sort", NULL ) ;
}
VOID LoadDumpFile() ;
HRESULT CheckLine( CHAR* strLine, LPDUMPMETADATA lpMetaData ) ;
HRESULT CheckMoreDump( FILE* pFile, LPDUMPMETADATA lpMetaData ) ;
const char* MakeDirectory( LPDUMPMETADATA lpMetaData, int nCnt ); // 해당 덤프하는 디렉토리를 만들고 해당 디렉토리 위치를 리턴한다.
BOOL CopyFileExt( LPDUMPMETADATA lpMetaData, LPSTR lpszFileName );
//=======================================================
// Directory 관련
//=======================================================
VOID FindDumpDirectory() ; //하위 디렉토리를 전부 검색하여 파일을 덤프 파일 목록과 디렉토리 목록을 만든다.
};

View File

@@ -0,0 +1,72 @@
// DumpStatistics.cpp : 응용 프로그램에 대한 클래스 동작을 정의합니다.
//
#include "stdafx.h"
#include "DumpStatistics.h"
#include "DumpStatisticsDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CDumpStatisticsApp
BEGIN_MESSAGE_MAP(CDumpStatisticsApp, CWinApp)
ON_COMMAND(ID_HELP, CWinApp::OnHelp)
END_MESSAGE_MAP()
// CDumpStatisticsApp 생성
CDumpStatisticsApp::CDumpStatisticsApp()
{
// TODO: 여기에 생성 코드를 추가합니다.
// InitInstance에 모든 중요한 초기화 작업을 배치합니다.
}
// 유일한 CDumpStatisticsApp 개체입니다.
CDumpStatisticsApp theApp;
// CDumpStatisticsApp 초기화
BOOL CDumpStatisticsApp::InitInstance()
{
// 응용 프로그램 매니페스트가 ComCtl32.dll 버전 6 이상을 사용하여 비주얼 스타일을
// 사용하도록 지정하는 경우, Windows XP 상에서 반드시 InitCommonControls()가 필요합니다.
// InitCommonControls()를 사용하지 않으면 창을 만들 수 없습니다.
InitCommonControls();
CWinApp::InitInstance();
AfxEnableControlContainer();
// 표준 초기화
// 이들 기능을 사용하지 않고 최종 실행 파일의 크기를 줄이려면
// 아래에서 필요 없는 특정 초기화 루틴을 제거해야 합니다.
// 해당 설정이 저장된 레지스트리 키를 변경하십시오.
// TODO: 이 문자열을 회사 또는 조직의 이름과 같은
// 적절한 내용으로 수정해야 합니다.
SetRegistryKey(_T("로컬 응용 프로그램 마법사에서 생성한 응용 프로그램"));
CDumpStatisticsDlg dlg;
m_pMainWnd = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: 여기에 대화 상자가 확인을 눌러 없어지는 경우 처리할
// 코드를 배치합니다.
}
else if (nResponse == IDCANCEL)
{
// TODO: 여기에 대화 상자가 취소를 눌러 없어지는 경우 처리할
// 코드를 배치합니다.
}
// 대화 상자가 닫혔으므로 응용 프로그램의 메시지 펌프를 시작하지 않고
// 응용 프로그램을 끝낼 수 있도록 FALSE를 반환합니다.
return FALSE;
}

View File

@@ -0,0 +1,31 @@
// DumpStatistics.h : PROJECT_NAME 응용 프로그램에 대한 주 헤더 파일입니다.
//
#pragma once
#ifndef __AFXWIN_H__
#error PCH에서 이 파일을 포함하기 전에 'stdafx.h'를 포함하십시오.
#endif
#include "resource.h" // 주 기호
// CDumpStatisticsApp:
// 이 클래스의 구현에 대해서는 DumpStatistics.cpp을 참조하십시오.
//
class CDumpStatisticsApp : public CWinApp
{
public:
CDumpStatisticsApp();
// 재정의
public:
virtual BOOL InitInstance();
// 구현
DECLARE_MESSAGE_MAP()
};
extern CDumpStatisticsApp theApp;

View File

@@ -0,0 +1,204 @@
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// 한국어 resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_KOR)
#ifdef _WIN32
LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT
#pragma code_page(949)
#endif //_WIN32
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE
BEGIN
"#include ""afxres.h""\r\n"
"\0"
END
3 TEXTINCLUDE
BEGIN
"#define _AFX_NO_SPLITTER_RESOURCES\r\n"
"#define _AFX_NO_OLE_RESOURCES\r\n"
"#define _AFX_NO_TRACKER_RESOURCES\r\n"
"#define _AFX_NO_PROPERTY_RESOURCES\r\n"
"\r\n"
"#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_KOR)\r\n"
"LANGUAGE 18, 1\r\n"
"#pragma code_page(949)\r\n"
"#include ""res\\DumpStatistics.rc2"" // Microsoft Visual C++에서 편집되지 않은 리소스\r\n"
"#include ""afxres.rc"" // 표준 구성 요소\r\n"
"#endif\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Icon
//
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems.
IDR_MAINFRAME ICON "res\\DumpStatistics.ico"
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//
IDD_ABOUTBOX DIALOGEX 0, 0, 235, 55
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION |
WS_SYSMENU
CAPTION "DumpStatistics 정보"
FONT 9, "MS Shell Dlg", 0, 0, 0x1
BEGIN
ICON IDR_MAINFRAME,IDC_STATIC,11,17,20,20
LTEXT "DumpStatistics Version 1.0",IDC_STATIC,40,10,119,8,
SS_NOPREFIX
LTEXT "Copyright (C) 2004",IDC_STATIC,40,25,119,8
DEFPUSHBUTTON "확인",IDOK,178,7,50,16,WS_GROUP
END
IDD_DUMPSTATISTICS_DIALOG DIALOGEX 0, 0, 359, 54
STYLE DS_SETFONT | DS_MODALFRAME | DS_SETFOREGROUND | DS_FIXEDSYS | WS_POPUP |
WS_VISIBLE | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW
CAPTION "Dump Statistics"
FONT 9, "MS Shell Dlg", 0, 0, 0x1
BEGIN
PUSHBUTTON "Set Current Directory",IDC_BTNCURRENTDIRECTORY,272,7,80,
14
PUSHBUTTON "Dump Processing",IDC_BTNDUMPPROCESSING,272,21,80,14
CONTROL "",IDC_DUMPPROGRESS,"msctls_progress32",WS_BORDER,7,21,
262,14
LTEXT "Static",IDC_DUMPFILE,7,39,345,8
EDITTEXT IDC_EDIT_PATH,7,7,262,12,ES_AUTOHSCROLL
END
/////////////////////////////////////////////////////////////////////////////
//
// Version
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,0,0,1
PRODUCTVERSION 1,0,0,1
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x4L
FILETYPE 0x1L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "041203b5"
BEGIN
VALUE "CompanyName", "TODO: <회사 이름>"
VALUE "FileDescription", "TODO: <파일 설명>"
VALUE "FileVersion", "1.0.0.1"
VALUE "InternalName", "DumpStatistics.exe"
VALUE "LegalCopyright", "TODO: (c) <회사 이름>. All rights reserved."
VALUE "OriginalFilename", "DumpStatistics.exe"
VALUE "ProductName", "TODO: <제품 이름>"
VALUE "ProductVersion", "1.0.0.1"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "변환", 0x412, 949
END
END
/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//
#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
IDD_ABOUTBOX, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 228
TOPMARGIN, 7
BOTTOMMARGIN, 48
END
IDD_DUMPSTATISTICS_DIALOG, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 352
TOPMARGIN, 7
BOTTOMMARGIN, 47
END
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// String Table
//
STRINGTABLE
BEGIN
IDS_ABOUTBOX "DumpStatistics 정보(&A)..."
END
#endif // 한국어 resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
#define _AFX_NO_SPLITTER_RESOURCES
#define _AFX_NO_OLE_RESOURCES
#define _AFX_NO_TRACKER_RESOURCES
#define _AFX_NO_PROPERTY_RESOURCES
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_KOR)
LANGUAGE 18, 1
#pragma code_page(949)
#include "res\DumpStatistics.rc2" // Microsoft Visual C++에서 편집되지 않은 리소스
#include "afxres.rc" // 표준 구성 요소
#endif
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED

View File

@@ -0,0 +1,206 @@
<?xml version="1.0" encoding="ks_c_5601-1987"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="7.10"
Name="DumpStatistics"
ProjectGUID="{95A6140D-E915-4434-8E49-E25812EB5786}"
SccProjectName=""
SccLocalPath=""
Keyword="MFCProj">
<Platforms>
<Platform
Name="Win32"/>
</Platforms>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="Debug"
IntermediateDirectory="Debug"
ConfigurationType="1"
UseOfMFC="2"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
Optimization="0"
PreprocessorDefinitions="WIN32;_WINDOWS;_DEBUG"
MinimalRebuild="TRUE"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
TreatWChar_tAsBuiltInType="TRUE"
UsePrecompiledHeader="3"
WarningLevel="3"
Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="4"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
LinkIncremental="2"
GenerateDebugInformation="TRUE"
SubSystem="2"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="_DEBUG"
MkTypLibCompatible="FALSE"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="_DEBUG"
Culture="1042"
AdditionalIncludeDirectories="$(IntDir)"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="Release"
IntermediateDirectory="Release"
ConfigurationType="1"
UseOfMFC="2"
CharacterSet="2">
<Tool
Name="VCCLCompilerTool"
PreprocessorDefinitions="WIN32;_WINDOWS;NDEBUG"
MinimalRebuild="FALSE"
RuntimeLibrary="2"
TreatWChar_tAsBuiltInType="TRUE"
UsePrecompiledHeader="3"
WarningLevel="3"
Detect64BitPortabilityProblems="TRUE"
DebugInformationFormat="3"/>
<Tool
Name="VCCustomBuildTool"/>
<Tool
Name="VCLinkerTool"
LinkIncremental="1"
GenerateDebugInformation="TRUE"
SubSystem="2"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"/>
<Tool
Name="VCMIDLTool"
PreprocessorDefinitions="NDEBUG"
MkTypLibCompatible="FALSE"/>
<Tool
Name="VCPostBuildEventTool"/>
<Tool
Name="VCPreBuildEventTool"/>
<Tool
Name="VCPreLinkEventTool"/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG"
Culture="1042"
AdditionalIncludeDirectories="$(IntDir)"/>
<Tool
Name="VCWebServiceProxyGeneratorTool"/>
<Tool
Name="VCXMLDataGeneratorTool"/>
<Tool
Name="VCWebDeploymentTool"/>
<Tool
Name="VCManagedWrapperGeneratorTool"/>
<Tool
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="소스 파일"
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
<File
RelativePath=".\DirDialog.cpp">
</File>
<File
RelativePath=".\DumpFileParser.cpp">
</File>
<File
RelativePath=".\DumpStatistics.cpp">
</File>
<File
RelativePath=".\DumpStatisticsDlg.cpp">
</File>
<File
RelativePath=".\stdafx.cpp">
<FileConfiguration
Name="Debug|Win32">
<Tool
Name="VCCLCompilerTool"
UsePrecompiledHeader="1"/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32">
<Tool
Name="VCCLCompilerTool"
UsePrecompiledHeader="1"/>
</FileConfiguration>
</File>
</Filter>
<Filter
Name="헤더 파일"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
<File
RelativePath=".\DirDialog.h">
</File>
<File
RelativePath=".\DumpFileParser.h">
</File>
<File
RelativePath=".\DumpStatistics.h">
</File>
<File
RelativePath=".\DumpStatisticsDlg.h">
</File>
<File
RelativePath=".\Resource.h">
</File>
<File
RelativePath=".\stdafx.h">
</File>
</Filter>
<Filter
Name="리소스 파일"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
<File
RelativePath=".\res\DumpStatistics.ico">
</File>
<File
RelativePath=".\DumpStatistics.rc">
</File>
<File
RelativePath=".\res\DumpStatistics.rc2">
</File>
</Filter>
<File
RelativePath=".\res\DumpStatistics.manifest">
</File>
<File
RelativePath=".\ReadMe.txt">
</File>
</Files>
<Globals>
<Global
Name="RESOURCE_FILE"
Value="DumpStatistics.rc"/>
</Globals>
</VisualStudioProject>

View File

@@ -0,0 +1,153 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Template|Win32">
<Configuration>Template</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{95A6140D-E915-4434-8E49-E25812EB5786}</ProjectGuid>
<SccProjectName />
<SccLocalPath />
<Keyword>MFCProj</Keyword>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>Dynamic</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>Dynamic</UseOfMfc>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup>
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Debug\</OutDir>
<IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Debug\</IntDir>
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
<OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Release\</OutDir>
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Release\</IntDir>
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
<CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Template|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
<CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Template|Win32'" />
<CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Template|Win32'" />
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>true</MinimalRebuild>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
<PrecompiledHeader>Use</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Windows</SubSystem>
<TargetMachine>MachineX86</TargetMachine>
</Link>
<Midl>
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MkTypLibCompatible>false</MkTypLibCompatible>
</Midl>
<ResourceCompile>
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<Culture>0x0412</Culture>
<AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>false</MinimalRebuild>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
<PrecompiledHeader>Use</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
</ClCompile>
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Windows</SubSystem>
<OptimizeReferences>true</OptimizeReferences>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<TargetMachine>MachineX86</TargetMachine>
</Link>
<Midl>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MkTypLibCompatible>false</MkTypLibCompatible>
</Midl>
<ResourceCompile>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<Culture>0x0412</Culture>
<AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
</ItemDefinitionGroup>
<ItemGroup>
<ClCompile Include="DirDialog.cpp" />
<ClCompile Include="DumpFileParser.cpp" />
<ClCompile Include="DumpStatistics.cpp" />
<ClCompile Include="DumpStatisticsDlg.cpp" />
<ClCompile Include="stdafx.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="DirDialog.h" />
<ClInclude Include="DumpFileParser.h" />
<ClInclude Include="DumpStatistics.h" />
<ClInclude Include="DumpStatisticsDlg.h" />
<ClInclude Include="Resource.h" />
<ClInclude Include="stdafx.h" />
</ItemGroup>
<ItemGroup>
<None Include="res\DumpStatistics.ico" />
<None Include="res\DumpStatistics.rc2" />
<None Include="ReadMe.txt" />
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="DumpStatistics.rc" />
</ItemGroup>
<ItemGroup>
<Manifest Include="res\DumpStatistics.manifest" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
<ProjectExtensions>
<VisualStudio>
<UserProperties RESOURCE_FILE="DumpStatistics.rc" />
</VisualStudio>
</ProjectExtensions>
</Project>

View File

@@ -0,0 +1,71 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="소스 파일">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="헤더 파일">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="리소스 파일">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="DirDialog.cpp">
<Filter>소스 파일</Filter>
</ClCompile>
<ClCompile Include="DumpFileParser.cpp">
<Filter>소스 파일</Filter>
</ClCompile>
<ClCompile Include="DumpStatistics.cpp">
<Filter>소스 파일</Filter>
</ClCompile>
<ClCompile Include="DumpStatisticsDlg.cpp">
<Filter>소스 파일</Filter>
</ClCompile>
<ClCompile Include="stdafx.cpp">
<Filter>소스 파일</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="DirDialog.h">
<Filter>헤더 파일</Filter>
</ClInclude>
<ClInclude Include="DumpFileParser.h">
<Filter>헤더 파일</Filter>
</ClInclude>
<ClInclude Include="DumpStatistics.h">
<Filter>헤더 파일</Filter>
</ClInclude>
<ClInclude Include="DumpStatisticsDlg.h">
<Filter>헤더 파일</Filter>
</ClInclude>
<ClInclude Include="Resource.h">
<Filter>헤더 파일</Filter>
</ClInclude>
<ClInclude Include="stdafx.h">
<Filter>헤더 파일</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="res\DumpStatistics.ico">
<Filter>리소스 파일</Filter>
</None>
<None Include="res\DumpStatistics.rc2">
<Filter>리소스 파일</Filter>
</None>
<None Include="ReadMe.txt" />
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="DumpStatistics.rc">
<Filter>리소스 파일</Filter>
</ResourceCompile>
</ItemGroup>
<ItemGroup>
<Manifest Include="res\DumpStatistics.manifest" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,194 @@
// DumpStatisticsDlg.cpp : 구현 파일
//
#include "stdafx.h"
#include "DumpStatistics.h"
#include "DumpStatisticsDlg.h"
#include ".\dumpstatisticsdlg.h"
#include "DumpFileParser.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 응용 프로그램 정보에 사용되는 CAboutDlg 대화 상자입니다.
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// 대화 상자 데이터
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원
// 구현
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
// CDumpStatisticsDlg 대화 상자
CDumpStatisticsDlg::CDumpStatisticsDlg(CWnd* pParent /*=NULL*/)
: CDialog(CDumpStatisticsDlg::IDD, pParent)
, m_DumpFile(_T(""))
, m_strBasePath(_T(""))
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CDumpStatisticsDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_DUMPFILE, m_DumpFile);
DDX_Text(pDX, IDC_EDIT_PATH, m_strBasePath);
}
BEGIN_MESSAGE_MAP(CDumpStatisticsDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_BTNCURRENTDIRECTORY, OnBnClickedBtncurrentdirectory)
ON_BN_CLICKED(IDC_BTNDUMPPROCESSING, OnBnClickedBtndumpprocessing)
ON_WM_DESTROY()
ON_NOTIFY(NM_CUSTOMDRAW, IDC_DUMPPROGRESS, OnNMCustomdrawDumpprogress)
END_MESSAGE_MAP()
// CDumpStatisticsDlg 메시지 처리기
BOOL CDumpStatisticsDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 시스템 메뉴에 "정보..." 메뉴 항목을 추가합니다.
// IDM_ABOUTBOX는 시스템 명령 범위에 있어야 합니다.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 이 대화 상자의 아이콘을 설정합니다. 응용 프로그램의 주 창이 대화 상자가 아닐 경우에는
// 프레임워크가 이 작업을 자동으로 수행합니다.
SetIcon(m_hIcon, TRUE); // 큰 아이콘을 설정합니다.
SetIcon(m_hIcon, FALSE); // 작은 아이콘을 설정합니다.
// TODO: 여기에 추가 초기화 작업을 추가합니다.
m_pDumpFileParser = new CDumpFileParser( this ) ;
return TRUE; // 컨트롤에 대한 포커스를 설정하지 않을 경우 TRUE를 반환합니다.
}
void CDumpStatisticsDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// 대화 상자에 최소화 단추를 추가할 경우 아이콘을 그리려면
// 아래 코드가 필요합니다. 문서/뷰 모델을 사용하는 MFC 응용 프로그램의 경우에는
// 프레임워크에서 이 작업을 자동으로 수행합니다.
void CDumpStatisticsDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 그리기를 위한 디바이스 컨텍스트
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 클라이언트 사각형에서 아이콘을 가운데에 맞춥니다.
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 아이콘을 그립니다.
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// 사용자가 최소화된 창을 끄는 동안에 커서가 표시되도록 시스템에서
// 이 함수를 호출합니다.
HCURSOR CDumpStatisticsDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
void CDumpStatisticsDlg::OnBnClickedBtncurrentdirectory()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
m_DirDialog.DoBrowse( GetSafeHwnd() ) ;
m_strBasePath = m_DirDialog.m_strPath ;
UpdateData( FALSE );
}
void CDumpStatisticsDlg::OnBnClickedBtndumpprocessing()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
UpdateData( TRUE );
if( ! ::SetCurrentDirectory( m_strBasePath ) )
return;
m_pDumpFileParser->SetDumpDirectory( m_strBasePath ) ;
m_pDumpFileParser->FindDumpDirectory();
m_pDumpFileParser->LoadDumpFile() ;
}
void CDumpStatisticsDlg::OnDestroy()
{
CDialog::OnDestroy();
// TODO: 여기에 메시지 처리기 코드를 추가합니다.
delete m_pDumpFileParser ;
}
void CDumpStatisticsDlg::OnNMCustomdrawDumpprogress(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
*pResult = 0;
}

View File

@@ -0,0 +1,43 @@
// DumpStatisticsDlg.h : 헤더 파일
//
#pragma once
#include "DirDialog.h"
class CDumpFileParser ;
// CDumpStatisticsDlg 대화 상자
class CDumpStatisticsDlg : public CDialog
{
private :
CDirDialog m_DirDialog ;
CDumpFileParser* m_pDumpFileParser ;
// 생성
public:
CDumpStatisticsDlg(CWnd* pParent = NULL); // 표준 생성자
// 대화 상자 데이터
enum { IDD = IDD_DUMPSTATISTICS_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원
// 구현
protected:
HICON m_hIcon;
// 메시지 맵 함수를 생성했습니다.
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedBtncurrentdirectory();
afx_msg void OnBnClickedBtndumpprocessing();
afx_msg void OnDestroy();
afx_msg void OnNMCustomdrawDumpprogress(NMHDR *pNMHDR, LRESULT *pResult);
CString m_DumpFile;
CString m_strBasePath;
};

View File

@@ -0,0 +1,77 @@
================================================================================
MFC 라이브러리 : DumpStatistics 프로젝트 개요
================================================================================
응용 프로그램 마법사를 사용하여 DumpStatistics 응용 프로그램을 만듭니다. 이 응용
프로그램에서는 기본적인 MFC 사용 밥법과 응용 프로그램 작성 방법을 설명합니다.
이 파일에는 DumpStatistics 응용 프로그램을 구성하는 각 파일에 대한 개요가 포함되어
있습니다.
DumpStatistics.vcproj
응용 프로그램 마법사를 사용하여 생성된 VC++ 프로젝트의 주 프로젝트 파일입니다.
이 파일에는 파일을 생성한 Visual C++ 버전 정보 및 응용 프로그램 마법사에서 선택한 플랫폼,
구성, 프로젝트 기능 등의 정보가 포함됩니다.
DumpStatistics.h
응용 프로그램의 주 헤더 파일입니다. 이 파일에는 다른 프로젝트에 관련된 Resource.h와 같은
특정 헤더가 포함되며 CDumpStatisticsApp 응용 프로그램 클래스가 선언됩니다.
DumpStatistics.cpp
CDumpStatisticsApp 응용 프로그램 클래스를 포함하는 주 응용 프로그램의 소스 파일입니다.
DumpStatistics.rc
프로그램에서 사용하는 모든 Microsoft Windows 리소스가 나열된 파일입니다.
이 파일에는 RES 하위 디렉터리에 저장된 아이콘, 비트맵 및 커서가 포함되며
Microsoft Visual C++에서 직접 이 파일을 편집할 수도 있습니다. 사용자의 프로젝트
리소스는 1042에 들어 있습니다.
res\DumpStatistics.ico
응용 프로그램의 아이콘으로 사용되는 아이콘 파일입니다.
이 아이콘은 주 리소스 파일인 DumpStatistics.rc에 포함됩니다.
res\DumpStatistics.rc2
Microsoft Visual C++에서 편집할 수 없는 리소스가 포함된 파일입니다.
리소스 편집기에서 편집할 수 없는 모든 리소스는 이 파일에 포함되어 있습니다.
/////////////////////////////////////////////////////////////////////////////
응용 프로그램 마법사에서는 단일 대화 상자 클래스를 만듭니다.
DumpStatisticsDlg.h, DumpStatisticsDlg.cpp - 대화 상자
CDumpStatisticsDlg 클래스를 포함하는 파일입니다. 이 클래스에는 응용 프로그램의
주 대화 상자에 대한 동작이 정의됩니다. 대화 상자의 템플릿은 DumpStatistics.rc에
있으며 Microsoft Visual C++에서 편집할 수 있습니다.
/////////////////////////////////////////////////////////////////////////////
기타 기능
ActiveX 컨트롤
응용 프로그램에서 ActiveX 컨트롤을 사용할 수 있습니다.
/////////////////////////////////////////////////////////////////////////////
기타 표준 파일
StdAfx.h, StdAfx.cpp
미리 컴파일된 헤더 파일(PCH) DumpStatistics.pch 및 미리 컴파일된
형식 파일 StdAfx.obj를 빌드할 때 사용되는 파일입니다.
Resource.h
새로운 리소스 ID를 정의하는 표준 헤더 파일입니다.
Microsoft Visual C++에서 이 파일을 읽고 업데이트합니다.
/////////////////////////////////////////////////////////////////////////////
기타 정보
응용 프로그램 마법사에서는 "TODO:"를 사용하여 추가하거나 사용자 지정해야 하는
소스 코드를 나타냅니다.
응용 프로그램에서 공유 DLL에 MFC를 사용하고 응용 프로그램의 언어가 운영 체제의
언어와 다른 경우 Microsoft Visual C++ CD-ROM의 Win\System 디렉터리에 있는
해당 지역의 리소스인 MFC70XXX.DLL을 컴퓨터의 system 또는 system32 디렉터리에
복사한 다음 MFCLOC.DLL로 이름을 바꾸어야 합니다. "XXX"는 해당 언어를 나타내는
약어입니다. 예를 들어 MFC70DEU.DLL에는 독일어로 변환된 리소스가 포함됩니다.
이런 작업을 하지 않으면 응용 프로그램의 일부 UI 요소가 운영 체제의 언어로
남아 있게 됩니다.
/////////////////////////////////////////////////////////////////////////////

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="X86"
name="Microsoft.Windows.DumpStatistics"
type="win32"
/>
<description>여기에 응용 프로그램 설명을 추가합니다.</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="X86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
</assembly>

View File

@@ -0,0 +1,13 @@
//
// DumpStatistics.RC2 - resources Microsoft Visual C++에서 직접 편집하지 않는 리소스
//
#ifdef APSTUDIO_INVOKED
#error 이 파일은 Microsoft Visual C++에서 편집할 수 없습니다.
#endif //APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
// 여기에 수동으로 편집한 리소스를 추가합니다.
/////////////////////////////////////////////////////////////////////////////

View File

@@ -0,0 +1,27 @@
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by DumpStatistics.rc
//
#define IDM_ABOUTBOX 0x0010
#define IDD_ABOUTBOX 100
#define IDS_ABOUTBOX 101
#define IDD_DUMPSTATISTICS_DIALOG 102
#define IDR_MAINFRAME 128
#define IDC_BTNCURRENTDIRECTORY 1000
#define IDC_BUTTON2 1001
#define IDC_BTNDUMPPROCESSING 1001
#define IDC_DUMPPROGRESS 1002
#define IDC_DUMPFILE 1003
#define IDC_EDIT1 1004
#define IDC_EDIT_PATH 1004
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 129
#define _APS_NEXT_COMMAND_VALUE 32771
#define _APS_NEXT_CONTROL_VALUE 1005
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif

View File

@@ -0,0 +1,7 @@
// stdafx.cpp : 표준 포함 파일을 포함하는 소스 파일입니다.
// DumpStatistics.pch는 미리 컴파일된 헤더가 됩니다.
// stdafx.obj는 미리 컴파일된 형식 정보를 포함합니다.
#include "stdafx.h"

View File

@@ -0,0 +1,42 @@
// stdafx.h : 잘 변경되지 않고 자주 사용하는
// 표준 시스템 포함 파일 및 프로젝트 관련 포함 파일이
// 들어 있는 포함 파일입니다.
#pragma once
#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN // Windows 헤더에서 거의 사용되지 않는 내용을 제외시킵니다.
#endif
// 아래 지정된 플랫폼보다 우선하는 플랫폼을 대상으로 하는 경우 다음 정의를 수정하십시오.
// 다른 플랫폼에 사용되는 해당 값의 최신 정보는 MSDN을 참조하십시오.
#ifndef WINVER // Windows 95 및 Windows NT 4 이후 버전에서만 기능을 사용할 수 있습니다.
#define WINVER 0x0400 // Windows 98과 Windows 2000 이후 버전에 맞도록 적합한 값으로 변경해 주십시오.
#endif
#ifndef _WIN32_WINNT // Windows NT 4 이후 버전에서만 기능을 사용할 수 있습니다.
#define _WIN32_WINNT 0x0400 // Windows 98과 Windows 2000 이후 버전에 맞도록 적합한 값으로 변경해 주십시오.
#endif
#ifndef _WIN32_WINDOWS // Windows 98 이후 버전에서만 기능을 사용할 수 있습니다.
#define _WIN32_WINDOWS 0x0410 // Windows Me 이후 버전에 맞도록 적합한 값으로 변경해 주십시오.
#endif
#ifndef _WIN32_IE // IE 4.0 이후 버전에서만 기능을 사용할 수 있습니다.
#define _WIN32_IE 0x0400 // IE 5.0 이후 버전에 맞도록 적합한 값으로 변경해 주십시오.
#endif
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 일부 CString 생성자는 명시적으로 선언됩니다.
// MFC의 공통 부분과 무시 가능한 경고 메시지에 대한 숨기기를 해제합니다.
#define _AFX_ALL_WARNINGS
#include <afxwin.h> // MFC 핵심 및 표준 구성 요소
#include <afxext.h> // MFC 익스텐션
#include <afxdisp.h> // MFC 자동화 클래스
#include <afxdtctl.h> // Internet Explorer 4 공용 컨트롤에 대한 MFC 지원
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h> // Windows 공용 컨트롤에 대한 MFC 지원
#endif // _AFX_NO_AFXCMN_SUPPORT