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:
123
Tools/DumpStatistics/DirDialog.cpp
Normal file
123
Tools/DumpStatistics/DirDialog.cpp
Normal 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;
|
||||
}
|
||||
29
Tools/DumpStatistics/DirDialog.h
Normal file
29
Tools/DumpStatistics/DirDialog.h
Normal 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_)
|
||||
|
||||
|
||||
913
Tools/DumpStatistics/DumpFileParser.cpp
Normal file
913
Tools/DumpStatistics/DumpFileParser.cpp
Normal 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;
|
||||
}
|
||||
138
Tools/DumpStatistics/DumpFileParser.h
Normal file
138
Tools/DumpStatistics/DumpFileParser.h
Normal 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() ; //하위 디렉토리를 전부 검색하여 파일을 덤프 파일 목록과 디렉토리 목록을 만든다.
|
||||
};
|
||||
72
Tools/DumpStatistics/DumpStatistics.cpp
Normal file
72
Tools/DumpStatistics/DumpStatistics.cpp
Normal 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;
|
||||
}
|
||||
31
Tools/DumpStatistics/DumpStatistics.h
Normal file
31
Tools/DumpStatistics/DumpStatistics.h
Normal 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;
|
||||
204
Tools/DumpStatistics/DumpStatistics.rc
Normal file
204
Tools/DumpStatistics/DumpStatistics.rc
Normal 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
|
||||
|
||||
206
Tools/DumpStatistics/DumpStatistics.vcproj
Normal file
206
Tools/DumpStatistics/DumpStatistics.vcproj
Normal 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>
|
||||
153
Tools/DumpStatistics/DumpStatistics.vcxproj
Normal file
153
Tools/DumpStatistics/DumpStatistics.vcxproj
Normal 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>
|
||||
71
Tools/DumpStatistics/DumpStatistics.vcxproj.filters
Normal file
71
Tools/DumpStatistics/DumpStatistics.vcxproj.filters
Normal 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>
|
||||
194
Tools/DumpStatistics/DumpStatisticsDlg.cpp
Normal file
194
Tools/DumpStatistics/DumpStatisticsDlg.cpp
Normal 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;
|
||||
}
|
||||
43
Tools/DumpStatistics/DumpStatisticsDlg.h
Normal file
43
Tools/DumpStatistics/DumpStatisticsDlg.h
Normal 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;
|
||||
};
|
||||
77
Tools/DumpStatistics/ReadMe.txt
Normal file
77
Tools/DumpStatistics/ReadMe.txt
Normal 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 요소가 운영 체제의 언어로
|
||||
남아 있게 됩니다.
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
BIN
Tools/DumpStatistics/res/DumpStatistics.ico
Normal file
BIN
Tools/DumpStatistics/res/DumpStatistics.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 21 KiB |
22
Tools/DumpStatistics/res/DumpStatistics.manifest
Normal file
22
Tools/DumpStatistics/res/DumpStatistics.manifest
Normal 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>
|
||||
13
Tools/DumpStatistics/res/DumpStatistics.rc2
Normal file
13
Tools/DumpStatistics/res/DumpStatistics.rc2
Normal file
@@ -0,0 +1,13 @@
|
||||
//
|
||||
// DumpStatistics.RC2 - resources Microsoft Visual C++에서 직접 편집하지 않는 리소스
|
||||
//
|
||||
|
||||
#ifdef APSTUDIO_INVOKED
|
||||
#error 이 파일은 Microsoft Visual C++에서 편집할 수 없습니다.
|
||||
#endif //APSTUDIO_INVOKED
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// 여기에 수동으로 편집한 리소스를 추가합니다.
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
27
Tools/DumpStatistics/resource.h
Normal file
27
Tools/DumpStatistics/resource.h
Normal 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
|
||||
7
Tools/DumpStatistics/stdafx.cpp
Normal file
7
Tools/DumpStatistics/stdafx.cpp
Normal file
@@ -0,0 +1,7 @@
|
||||
// stdafx.cpp : 표준 포함 파일을 포함하는 소스 파일입니다.
|
||||
// DumpStatistics.pch는 미리 컴파일된 헤더가 됩니다.
|
||||
// stdafx.obj는 미리 컴파일된 형식 정보를 포함합니다.
|
||||
|
||||
#include "stdafx.h"
|
||||
|
||||
|
||||
42
Tools/DumpStatistics/stdafx.h
Normal file
42
Tools/DumpStatistics/stdafx.h
Normal 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
|
||||
|
||||
Reference in New Issue
Block a user