| | |
| | | #include "stdafx.h" |
| | | #include "DitGlassRawMessenger.h" |
| | | #include "DitGlassRawMessengerDlg.h" |
| | | |
| | | #include "SelfDump.h" /* < KMH 20220406 : #4053 ADD > */ |
| | | #ifdef _DEBUG |
| | | #define new DEBUG_NEW |
| | | #endif |
| | |
| | | // ì ì í ë´ì©ì¼ë¡ ìì í´ì¼ í©ëë¤. |
| | | SetRegistryKey(_T("ë¡ì»¬ ìì© íë¡ê·¸ë¨ ë§ë²ì¬ìì ìì±ë ìì© íë¡ê·¸ë¨")); |
| | | |
| | | /* < KMH 20220406 : #4053 ADD Start > */ |
| | | CSelfDump cDump; |
| | | cDump.RegisterExceptionFilter(); |
| | | |
| | | //CreateDirectory("D:\\AOIServer\\Temp", NULL); |
| | | /* < KMH 20220406 : #4053 ADD End > */ |
| | | |
| | | CDitGlassRawMessengerDlg dlg; |
| | | m_pMainWnd = &dlg; |
| | | INT_PTR nResponse = dlg.DoModal(); |
| | |
| | | <GenerateDebugInformation>true</GenerateDebugInformation> |
| | | <SubSystem>Windows</SubSystem> |
| | | <TargetMachine>MachineX64</TargetMachine> |
| | | <UACExecutionLevel>RequireAdministrator</UACExecutionLevel> |
| | | </Link> |
| | | </ItemDefinitionGroup> |
| | | <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> |
| | |
| | | <OptimizeReferences>true</OptimizeReferences> |
| | | <EnableCOMDATFolding>true</EnableCOMDATFolding> |
| | | <TargetMachine>MachineX64</TargetMachine> |
| | | <UACExecutionLevel>RequireAdministrator</UACExecutionLevel> |
| | | </Link> |
| | | </ItemDefinitionGroup> |
| | | <ItemGroup> |
| | |
| | | <ClCompile Include="InterfaceFTP.cpp" /> |
| | | <ClCompile Include="MacroResultFile.cpp" /> |
| | | <ClCompile Include="RawResultReader.cpp" /> |
| | | <ClCompile Include="SelfDump.cpp" /> |
| | | <ClCompile Include="StackResultCPJT.cpp" /> |
| | | <ClCompile Include="StackResultCSOT.cpp" /> |
| | | <ClCompile Include="stdafx.cpp"> |
| | |
| | | <ClInclude Include="MacroResultFile.h" /> |
| | | <ClInclude Include="RawResultReader.h" /> |
| | | <ClInclude Include="Resource.h" /> |
| | | <ClInclude Include="SelfDump.h" /> |
| | | <ClInclude Include="StackResultCPJT.h" /> |
| | | <ClInclude Include="StackResultCSOT.h" /> |
| | | <ClInclude Include="stdafx.h" /> |
| | |
| | | <ClCompile Include="RawResultReader.cpp"> |
| | | <Filter>RawInterface\Stack</Filter> |
| | | </ClCompile> |
| | | <ClCompile Include="SelfDump.cpp"> |
| | | <Filter>ìì¤ íì¼</Filter> |
| | | </ClCompile> |
| | | </ItemGroup> |
| | | <ItemGroup> |
| | | <ClInclude Include="akLoggerExt.h"> |
| | |
| | | <ClInclude Include="RawResultReader.h"> |
| | | <Filter>RawInterface\Stack</Filter> |
| | | </ClInclude> |
| | | <ClInclude Include="SelfDump.h"> |
| | | <Filter>í¤ë íì¼</Filter> |
| | | </ClInclude> |
| | | </ItemGroup> |
| | | <ItemGroup> |
| | | <None Include="res\DitGlassRawMessenger.ico"> |
| | |
| | | m_vecStrGridDefectHeader.push_back("MergeState"); |
| | | |
| | | } |
| | | |
| | | void CDitGlassRawMessengerDlg::DoDataExchange(CDataExchange* pDX) |
| | | { |
| | | CDialog::DoDataExchange(pDX); |
| | |
| | | |
| | | BOOL CDitGlassRawMessengerDlg::OnInitDialog() |
| | | { |
| | | |
| | | /* <LJC 20220407 : #4053 MOD Start> */ |
| | | CString strTemp; |
| | | strTemp.Format(_T("Version : %s %s"), _T(__DATE__), _T(__TIME__)); |
| | | AKLOG("DITRawMessenger íë¡ê·¸ë¨ ì¤í( : %s )", strTemp); |
| | | /* <LJC 20220407 : #4053 MOD End> */ |
| | | CDialog::OnInitDialog(); |
| | | |
| | | DragAcceptFiles(TRUE); |
| | |
| | | { |
| | | HMENU hMenu = CreatePopupMenu(); |
| | | AppendMenu(hMenu, MF_STRING, 0, "ì°êµ¬ì2íí¸ìí"); |
| | | AppendMenu(hMenu, MF_STRING, WM_DESTROY, "Exit"); |
| | | AppendMenu(hMenu, MF_STRING, WM_DESTROY, "Exit"); |
| | | TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, pos.x, pos.y, 0, GetSafeHwnd(), NULL); |
| | | } |
| | | |
| | |
| | | Sleep(10); |
| | | } |
| | | pThis->m_nThreadMainFlag = 0; |
| | | /* <KMH 20220407 : #4053 ADD Start> */ |
| | | AKLOG("Main Thread End"); |
| | | /* <KMH 20220407 : #4053 ADD End> */ |
| | | } |
| | | |
| | | void CDitGlassRawMessengerDlg::MainProcess() |
| | |
| | | WriteConfigFile(); |
| | | |
| | | } |
| | | |
| | | |
| | | BOOL CDitGlassRawMessengerDlg::DestroyWindow() |
| | | { |
| | |
| | | |
| | | #define LOCAL_AOIRAWDFS_PATH "D:\\DIT_ResultData\\Raw" |
| | | #define LOCAL_AOIRAWBIN_PATH "D:\\DIT_ResultData\\RawBin" |
| | | //TEST |
| | | // #define NETWORK_AOIRAWDFS_PATH "D:\\DIT_ResultData\\Raw" |
| | | // #define NETWORK_AOIRAWBIN_PATH "D:\\DIT_ResultData\\RawBin" |
| | | |
| | | #define NETWORK_AOIRAWDFS_PATH "\\\\126.100.100.1\\d\\DIT_ResultData\\Raw" |
| | | #define NETWORK_AOIRAWBIN_PATH "\\\\126.100.100.1\\d\\DIT_ResultData\\RawBin" |
| | | |
| | |
| | | /* <LJC 20211122 : #3820 ADD Start> */ |
| | | #define NETWORK_AOIRAWMERGELOCAL_PATH "D:\\DIT_ResultData\\RawMerge" |
| | | /* <LJC 20211122 : #3820 ADD End> */ |
| | | |
| | | /* <KMH 20220407 : #4053 ADD Start> */ |
| | | #define LOCAL_LOGDATA_PATH "D:\\DIT_LogData" |
| | | /* <KMH 20220407 : #4053 ADD End> */ |
| | | char* g_pCellCode = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; |
| | | |
| | | void _TimeDelay(int delay) |
| | |
| | | CreateDirectory(LOCAL_AOIRAWDFS_PATH, NULL); |
| | | CreateDirectory(LOCAL_AOIRAWBIN_PATH, NULL); |
| | | CreateDirectory("D:\\Raw_im", NULL); |
| | | |
| | | /* <KMH 20220407 : #4053 ADD Start> */ |
| | | CFileFind FileFinder; |
| | | SYSTEMTIME st; |
| | | GetLocalTime(&st); |
| | | char strLogFolderPath [256]; |
| | | sprintf(strLogFolderPath, "%s\\%02d%02d%02d", LOCAL_LOGDATA_PATH,st.wYear, st.wMonth, st.wDay); |
| | | |
| | | BOOL bFind = FileFinder.FindFile(strLogFolderPath); |
| | | if (!bFind) |
| | | { |
| | | CreateDirectory(strLogFolderPath, NULL); |
| | | } |
| | | /* <KMH 20220407 : #4053 ADD End> */ |
| | | m_MuraResultFile.readOptionFile("C:\\DIT_Review\\ReviewServerConfig\\MacroInfo.cfg"); |
| | | |
| | | m_GlassRawRTMS.SetMuraResult(&m_MuraResultFile); |
| | |
| | | |
| | | BOOL CGlassRawCPJT::SequenceGlassLoading( CgrmGlassRawData* pData ) |
| | | { |
| | | |
| | | AKLOG("Sequence : Glass Loading Signal Start ");/* <KMH 20220407 : #4053 ADD > */ |
| | | SetEnableFtpAck(FALSE); |
| | | m_nRawMergeIdx = 0; |
| | | if(m_StackResult.getStackUse()) |
| | |
| | | { |
| | | File.FindNextFile(); |
| | | strStackFileLocalPath = File.GetFilePath(); |
| | | DeleteFile(strStackFileLocalPath); |
| | | Sleep(10); |
| | | /* <KMH 20220407 : #4053 MOD Start> */ |
| | | if (DeleteFile(strStackFileLocalPath)) |
| | | /*< SWK 20220413 - #4053 MOD Start >*/ |
| | | // { |
| | | // AKLOG(" Fucntion : Delete Stack File Sucess[%s] ", strStackFileLocalPath); |
| | | // } |
| | | // /* <KMH 20220407 : #4053 MOD End> */ |
| | | // Sleep(10); |
| | | // } |
| | | // else |
| | | // { |
| | | // AKLOG(" Function : Delete Stack File Fail [%s]", strStackFileLocalPath);/* <KMH 20220407 : #4053 MOD > */ |
| | | // } |
| | | AKLOG(" Function : Delete Stack File Sucess[%s] ", strStackFileLocalPath); |
| | | else |
| | | AKLOG(" Function : Delete Stack File Fail [%s]", strStackFileLocalPath); |
| | | } |
| | | else |
| | | { |
| | | AKLOG("Delete Stack File Fail [%s]", strStackFileLocalPath); |
| | | } |
| | | |
| | | /*< SWK 20220413 - #4053 MOD End >*/ |
| | | |
| | | //201218 CJH - Stack Download ìë |
| | | SendMessageFTPDownloadStack(pData->GetGlassData()); |
| | |
| | | { |
| | | File.FindNextFile(); |
| | | strRawFileLocalPath = File.GetFilePath(); |
| | | DeleteFile(strRawFileLocalPath); |
| | | Sleep(10); |
| | | /* <KMH 20220407 : #4053 MOD Start> */ |
| | | if (DeleteFile(strRawFileLocalPath)) |
| | | /*< SWK 20220413 - #4053 MOD Start >*/ |
| | | // { |
| | | // AKLOG(" Fucntion : Delete RawMerge File Sucess[%s] ", strRawFileLocalPath); |
| | | // } |
| | | // /* <KMH 20220407 : #4053 MOD End> */ |
| | | // Sleep(10); |
| | | // } |
| | | // else |
| | | // { |
| | | // AKLOG(" Function : Delete RawMerge File Fail [%s]", strRawFileLocalPath); /* <KMH 20220407 : #4053 ADD > */ |
| | | // } |
| | | AKLOG(" Function : Delete RawMerge File Sucess[%s] ", strRawFileLocalPath); |
| | | else |
| | | AKLOG(" Function : Delete RawMerge File Fail [%s]", strRawFileLocalPath); |
| | | } |
| | | /*< SWK 20220413 - #4053 MOD End >*/ |
| | | SetEnableFtpAck(TRUE); |
| | | DownLoadMergeFile(pData); |
| | | } |
| | | /* <LJC 20211122 : #3820 ADD End> */ |
| | | /*< KJG 20211024 - #3487 ADD End >*/ |
| | | |
| | | AKLOG("Sequence : Glass Loading Signal End "); |
| | | return TRUE; |
| | | } |
| | | |
| | | BOOL CGlassRawCPJT::SequenceInspectEnd( CgrmGlassRawData* pData ) |
| | | { |
| | | AKLOG(" Sequence : InspectionEnd Signal Start"); /* <KMH 20220407 : #4053 ADD > */ |
| | | |
| | | m_bReviewEndCheck = FALSE; |
| | | //210128 |
| | | m_tmReviewEnd = m_tmReviewStart = CTime::GetCurrentTime(); |
| | |
| | | fclose(pf); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | SendMessageFTPUploadImage(pData->GetGlassData(), FTPCMD_MURA_IMAGE);/* <KMH 20220407 : #4053 ADD > */ |
| | | } |
| | | |
| | | /* <KYH 211129 : #3806 ADD End> */ |
| | | SendMessageFTPUploadImage(pData->GetGlassData(), FTPCMD_MURA_IMAGE);//0405nwh |
| | | |
| | | |
| | | AKLOG(" Sequence : InspectionEnd Signal End"); /* <KMH 20220407 : #4053 ADD > */ |
| | | return TRUE; |
| | | } |
| | | |
| | |
| | | |
| | | BOOL CGlassRawCPJT::SequenceFtpUpload(char* pRawFilePathName) |
| | | { |
| | | AKLOG(" Sequence : FTP Upload Signal Start "); |
| | | // Manual Upload ê¸°ë¥ [21-02-05 KJG] |
| | | CTime tmFileCreate; |
| | | _grmGlassData GlassData; |
| | |
| | | |
| | | fclose(pf); |
| | | |
| | | |
| | | AKLOG(" Sequence : FTP Upload Signal End "); |
| | | return TRUE; |
| | | } |
| | | |
| | |
| | | CString strValue; |
| | | /*< KJG 20211229 - #3846 MOD Start >*/ |
| | | //strValue = "ITEM PANEL MODULETYPE MODULEID PROCESSID PRODUCTID STEPID PROD_TYPE BATCHID H_PANELID E_PANELID P_PANELID OPERID COMP_COUNT PPID GRADE CODE R_GRADE MAP_IMAGE L_TIME U_TIME S_TIME E_TIME T_DEFECT TR PR NG TB TW RB RW T_STACK NO_DEFECT MAX_AVG_GRAY MAX_PORTION OK_CELL RJ_CELL RW_CELL NR_CELL CSTID SLOT_NO JOB_END TD_DEFECT SD_DEFECT PD_DEFECT SP_DEFECT PAD_GATE PAD_DATA M_DEFECT C_DEFECT LN_DEFECT IMG_COUNT RECIPE SHRINK RAW_CUT CRACK_DEFECT"; |
| | | strValue = "ITEM PANEL MODULETYPE MODULEID PROCESSID PRODUCTID STEPID PROD_TYPE BATCHID H_PANELID E_PANELID P_PANELID OPERID COMP_COUNT PPID GRADE CODE R_GRADE MAP_IMAGE L_TIME U_TIME S_TIME E_TIME T_DEFECT TR PR NG TB TW RB RW T_STACK NO_DEFECT MAX_NG MAX_PORTION OK_CELL RJ_CELL RW_CELL NR_CELL CSTID SLOT_NO JOB_END TD_DEFECT SD_DEFECT PD_DEFECT SP_DEFECT PAD_GATE PAD_DATA M_DEFECT C_DEFECT LN_DEFECT IMG_COUNT RECIPE SHRINK RAW_CUT CRACK_DEFECT"; //56ea |
| | | /* <LJC 20220425 : #3957 MOD Start> */ |
| | | strValue = "ITEM PANEL MODULETYPE MODULEID PROCESSID PRODUCTID STEPID PROD_TYPE BATCHID H_PANELID E_PANELID P_PANELID OPERID COMP_COUNT PPID GRADE CODE R_GRADE MAP_IMAGE L_TIME U_TIME S_TIME E_TIME T_DEFECT TR PR NG TB TW RB RW T_STACK NO_DEFECT MAX_NG MAX_PORTION OK_CELL RJ_CELL RW_CELL NR_CELL CSTID SLOT_NO JOB_END TD_DEFECT SD_DEFECT PD_DEFECT SP_DEFECT PAD_GATE PAD_DATA M_DEFECT C_DEFECT LN_DEFECT IMG_COUNT RECIPE SHRINK RAW_CUT CRACK_DEFECT CODE_COUNT1 CODE_COUNT2 CODE_COUNT3 CODE_COUNT4 CODE_COUNT5 CODE_COUNT6 CODE_COUNT7 CODE_COUNT8 CODE_COUNT9 CODE_COUNT10"; //56ea |
| | | /* <LJC 20220425 : #3957 MOD End> */ |
| | | /*< KJG 20211229 - #3846 MOD End >*/ |
| | | strLine += strValue; strLine += "\n"; |
| | | strValue = "ITEM SUBPANEL SUBPANELID COORD_X COORD_Y SIZE_X SIZE_Y GATELINE DATALINE GRADE CODE R_GRADE T_DEFECT TD_DEFECT SD_DEFECT PD_DEFECT SP_DEFECT PAD_GATE PAD_DATA M_DEFECT C_DEFECT LN_DEFECT TR PR NG RB RW TB TW T_STACK NO_DEFECT"; //31ea /* <KYH 211129 : #3796 MOD Start> */ |
| | | /* <LJC 20220425 : #3957 MOD Start> */ |
| | | strValue = "ITEM SUBPANEL SUBPANELID COORD_X COORD_Y SIZE_X SIZE_Y GATELINE DATALINE GRADE CODE R_GRADE T_DEFECT TD_DEFECT SD_DEFECT PD_DEFECT SP_DEFECT PAD_GATE PAD_DATA M_DEFECT C_DEFECT LN_DEFECT TR PR NG RB RW TB TW T_STACK NO_DEFECT CODE_COUNT1 CODE_COUNT2 CODE_COUNT3 CODE_COUNT4 CODE_COUNT5 CODE_COUNT6 CODE_COUNT7 CODE_COUNT8 CODE_COUNT9 CODE_COUNT10"; //31ea /* <KYH 211129 : #3796 MOD Start> */ |
| | | /* <LJC 20220425 : #3957 MOD End> */ |
| | | strLine += strValue; strLine += "\n"; |
| | | strValue = "ITEM DEFECT ID DEF_NO COORD_X COORD_Y GATELINE DATALINE SIZE_S SIZE_W SIZE_L SIZE_H GRADE CODE STACK_FLAG STACK_COUNT STACK_STEP IMAGE_FILE LINE_CODE VC_CODE DCR_CODE DEFECT_SIZE REPEAT_DEFECT WSI_HEIGHT CS_HEIGHT C_GRADE GRAY_MIN GRAY_MAX GRAY_AVG GRAY_DEF WSI_IMAGE USE_CCDIMAGE SCAN_NUM CAM_POSITION CCD_NO R_GRAY_MIN R_GRAY_MAX R_GRAY_AVG R_HEIGHT G_HEIGHT B_HEIGHT INS_CHANNEL COMPACTNESS THICKNESS MAJOR MINOR WSI_TYPE DEFECT_TYPE SHRINK CLASS_CODE"; //50ea |
| | | strLine += strValue; |
| | |
| | | { |
| | | SPRINTRAW(12, "UNUSE"); |
| | | } |
| | | |
| | | /* <LJC 20220425 : #3957 ADD Start> */ |
| | | for (int i = 0; i < RAW_CODE_MAX; i++) |
| | | { |
| | | if (pGlassData->m_nDefectCode[i] >= 0) |
| | | { |
| | | SPRINTRAW(12, "%d", pGlassData->m_nDefectCode[i]); |
| | | } |
| | | else |
| | | { |
| | | SPRINTRAW(12, "*"); |
| | | } |
| | | } |
| | | /* <LJC 20220425 : #3957 ADD End> */ |
| | | SPRINTRAWEND; //ì¤ì!!! ì ¤ ë§ì§ë§ì ê¼ ìì´ì¼í¨!!!(ìì ê¸ì§) [ê¹íí2020/9/23] |
| | | } |
| | | |
| | |
| | | // 31 6 NO_DEFECT ì¶ê° |
| | | SPRINTRAW(12, "%d", pCellData->m_nDefectNumJudgeND); //KYH ND ë°ì´í° ì¶ê° |
| | | /* <KYH 211129 : #3796 MOD End> */ |
| | | |
| | | /* <LJC 20220425 : #3957 ADD Start> */ |
| | | for (int i = 0; i < RAW_CODE_MAX; i++) |
| | | { |
| | | if (pCellData->m_nDefectCode[i] >= 0) |
| | | { |
| | | SPRINTRAW(12, "%d", pCellData->m_nDefectCode[i]); |
| | | } |
| | | else |
| | | { |
| | | SPRINTRAW(12, "*"); |
| | | } |
| | | } |
| | | /* <LJC 20220425 : #3957 ADD End> */ |
| | | SPRINTRAWEND; //ì¤ì!!! ì ¤ ë§ì§ë§ì ê¼ ìì´ì¼í¨!!!(ìì ê¸ì§) [ê¹íí2020/9/23] |
| | | } |
| | | |
| | |
| | | cds.lpData = &upParam; |
| | | |
| | | DWORD dwReturn = 0; |
| | | if(SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 30000, (PDWORD_PTR)(dwReturn)) == FALSE) |
| | | { |
| | | } |
| | | |
| | | if(SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 5000, (PDWORD_PTR)(dwReturn)) == FALSE) |
| | | AKLOG(" FunCtion FTP : RAW File Upload Signal Fail[%d]", FTPCMD_RAW);/* <KMH 20220407 : #4053 ADD > */ |
| | | else |
| | | AKLOG(" FunCtion FTP : RAW File Upload Signal Sucess[%d]", FTPCMD_RAW);/* <KMH 20220407 : #4053 ADD > */ |
| | | } |
| | | |
| | | void CGlassRawCPJT::SendMessageFTPDownloadStack( _grmGlassData* pGlassData ) |
| | |
| | | cds.lpData = &upParam; |
| | | |
| | | DWORD dwReturn = 0; |
| | | if(SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 20000, (PDWORD_PTR)(dwReturn)) == FALSE) |
| | | { |
| | | } |
| | | if (SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 5000, (PDWORD_PTR)(dwReturn)) == FALSE) |
| | | /*< SWK 20220413 - #4053 MOD Start >*/ |
| | | // { |
| | | // AKLOG(" Fucntion FTP : Stack File Download Signal Fail[%d]", FTPCMD_STACK);/* <KMH 20220407 : #4053 ADD > */ |
| | | // } |
| | | // else |
| | | // { |
| | | // AKLOG(" Fucntion FTP : Stack File Download Signal Sucess[%d]", FTPCMD_STACK);/* <KMH 20220407 : #4053 ADD > */ |
| | | // } |
| | | AKLOG(" Function FTP : Stack File Download Signal Fail[%d]", FTPCMD_STACK); |
| | | else |
| | | AKLOG(" Function FTP : Stack File Download Signal Success[%d]", FTPCMD_STACK); |
| | | /*< SWK 20220413 - #4053 MOD End >*/ |
| | | } |
| | | |
| | | void CGlassRawCPJT::SendMessageFTPDownloadDataFile( _grmGlassData* pGlassData ) |
| | |
| | | cds.lpData = &upParam; |
| | | |
| | | DWORD dwReturn = 0; |
| | | if(SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 20000, (PDWORD_PTR)(dwReturn)) == FALSE) |
| | | { |
| | | } |
| | | if (SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 5000, (PDWORD_PTR)(dwReturn)) == FALSE) |
| | | /*< SWK 20220413 - #4053 MOD Start >*/ |
| | | // { |
| | | // AKLOG(" Fucntion FTP : RawMerge File Download Signal Sucess[%d]", FTPCMD_RAWMERGE);/* <KMH 20220407 : #4053 ADD > */ |
| | | // } |
| | | // else |
| | | // { |
| | | // AKLOG(" Fucntion FTP : RawMerge File Download Signal Fail[%d]", FTPCMD_RAWMERGE);/* <KMH 20220407 : #4053 ADD > */ |
| | | // } |
| | | AKLOG(" Function FTP : RawMerge File Download Signal Fail[%d]", FTPCMD_RAWMERGE); |
| | | else |
| | | AKLOG(" Function FTP : RawMerge File Download Signal Success[%d]", FTPCMD_RAWMERGE); |
| | | /*< SWK 20220413 - #4053 MOD End >*/ |
| | | /*< KJG 20211024 - #3487 ADD End >*/ |
| | | } |
| | | |
| | |
| | | cds.lpData = &upParam; |
| | | |
| | | DWORD dwReturn = 0; |
| | | if(SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 20000, (PDWORD_PTR)(dwReturn)) == FALSE) |
| | | { |
| | | } |
| | | if (SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 5000, (PDWORD_PTR)(dwReturn)) == FALSE) |
| | | /*< SWK 20220413 - #4053 MOD Start >*/ |
| | | // { |
| | | // AKLOG(" Fucntion FTP : Image Upload Signla Sucess[%d]", sort);/* <KMH 20220407 : #4053 ADD > */ |
| | | // } |
| | | // else |
| | | // { |
| | | // AKLOG(" Fucntion FTP : Image Upload Signla Fail[%d]", sort);/* <KMH 20220407 : #4053 ADD > */ |
| | | // } |
| | | AKLOG(" Function FTP : Image Upload Signal Fail[%d]", sort); |
| | | else |
| | | AKLOG(" Function FTP : Image Upload Signal Success[%d]", sort); |
| | | /*< SWK 20220413 - #4053 MOD End >*/ |
| | | } |
| | | |
| | | |
| | |
| | | cds.lpData = &upParam; |
| | | |
| | | DWORD dwReturn = 0; |
| | | if(SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 20000, (PDWORD_PTR)(dwReturn)) == FALSE) |
| | | { |
| | | } |
| | | if (SendMessageTimeout(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds, SMTO_NORMAL, 5000, (PDWORD_PTR)(dwReturn)) == FALSE) |
| | | /*< SWK 20220413 - #4053 MOD Start >*/ |
| | | // { |
| | | // AKLOG(" Fucntion FTP : Index File Upload Signla Sucess[%d]", FTPCMD_INDEX);/* <KMH 20220407 : #4053 ADD > */ |
| | | // } |
| | | // else |
| | | // { |
| | | // AKLOG(" Fucntion FTP : Index File Upload Signla Fail[%d]", FTPCMD_INDEX);/* <KMH 20220407 : #4053 ADD > */ |
| | | // } |
| | | AKLOG(" Function FTP : Index File Upload Signal Fail[%d]", FTPCMD_INDEX); |
| | | else |
| | | AKLOG(" Function FTP : Index File Upload Signal Success[%d]", FTPCMD_INDEX); |
| | | /*< SWK 20220413 - #4053 MOD End >*/ |
| | | |
| | | return TRUE; |
| | | } |
| | | |
| | |
| | | |
| | | #define LOCAL_AOIRAWDFS_PATH "D:\\DIT_ResultData\\Raw" |
| | | #define LOCAL_AOIRAWBIN_PATH "D:\\DIT_ResultData\\RawBin" |
| | | |
| | | #define NETWORK_AOIRAWDFS_PATH "\\\\126.100.100.1\\d\\DIT_ResultData\\Raw" |
| | | #define NETWORK_AOIRAWBIN_PATH "\\\\126.100.100.1\\d\\DIT_ResultData\\RawBin" |
| | | |
| | |
| | | |
| | | strFileName.Format("%s\\%s", m_strLocalPath, pGlassID); |
| | | |
| | | |
| | | FILE* pf = fopen(strFileName.GetBuffer(0), "r"); |
| | | |
| | | if (pf == NULL) |
| | | return FALSE; |
| | | |
| | | /* <KMH 20220407 : #4053 ADD Start> */ |
| | | AKLOG("Function : Read File Path: %s" , strFileName); |
| | | /* <KMH 20220407 : #4053 ADD End> */ |
| | | /*< KJG 20211208 : #3696 ADD Start >*/ |
| | | CDitGlassRawClient GlassRawClient; |
| | | GlassRawClient.ConnectServer(); |
| | |
| | | akFileDB.getItem("RawMerge_Use", &m_bStackUse, 0); |
| | | akFileDB.getItem("RawMerge_LocalPath", m_strLocalPath, "D:\\DIT_ResultData\\RawMerge"); |
| | | |
| | | if (m_bStackUse && m_nThreadStackFileReadFlag == 0) |
| | | //< SWK 20220413 - #4053 MOD > |
| | | // if (/*m_bStackUse && */m_nThreadStackFileReadFlag == 0) |
| | | if (m_nThreadStackFileReadFlag == 0) |
| | | { |
| | | _beginthread(threadResultFileRead, NULL, this); |
| | | } |
| | |
| | | nReadFailCount = 0; |
| | | |
| | | AKLOG("RawMerge File Read Start : %s\\%s", pThis->m_strLocalPath, strGlassID); |
| | | Sleep(3000); |
| | | //< SWK 20220413 - #4053 DEL > |
| | | // Sleep(3000); |
| | | while (pThis->m_nProcessState == RPS_StateFileRead && pThis->m_nThreadStackFileReadFlag == 1) |
| | | { |
| | | if ((nThreadCount++ % 20) != 0) //ëª
ë ¹ ìíì ë¹ ë¥´ê² ê°ì§ ìí ì¡°ì¹ |
| | |
| | | } |
| | | |
| | | nReadFailCount++; |
| | | AKLOG("RawMerge File Read Try : %d", nReadFailCount); |
| | | //< SWK 20220413 - #4053 DEL > |
| | | // AKLOG("RawMerge File Read Try : %d", nReadFailCount); |
| | | |
| | | if (nReadFailCount > 10) |
| | | { |
| | | pThis->m_nProcessState = RPS_ResultReadFail; |
| | | break; |
| | | } |
| | | //< SWK 20220413 - #4053 ADD > |
| | | AKLOG("RawMerge File Read Try : %d", nReadFailCount); |
| | | |
| | | Sleep(50); |
| | | //< SWK 20220413 - #4053 DEL > |
| | | // Sleep(50); |
| | | } |
| | | if (pThis->m_nProcessState != RPS_ResultReadOK) |
| | | { |
| | |
| | | pThis->m_nThreadStackFileReadFlag = 0; |
| | | } |
| | | /* <LJC 20211122 : #3820 ADD Start> */ |
| | | void CRawResultReader::ProcessResultFileRead(void * pArg) |
| | | /*< SWK 20220413 - #4053 MOD Start >*/ |
| | | //void CRawResultReader::ProcessResultFileRead(void * pArg) |
| | | void CRawResultReader::ProcessResultFileRead() |
| | | /*< SWK 20220413 - #4053 MOD End >*/ |
| | | { |
| | | CRawResultReader* pThis = (CRawResultReader*)pArg; |
| | | |
| | | pThis->m_nThreadStackFileReadFlag = 1; |
| | | /*< SWK 20220413 - #4053 MOD Start >*/ |
| | | // CRawResultReader* pThis = (CRawResultReader*)pArg; |
| | | // |
| | | // pThis->m_nThreadStackFileReadFlag = 1; |
| | | // int nReadFailCount = 0; |
| | | // int nThreadCount = 0; |
| | | // CString strGlassID; |
| | | // |
| | | // while (pThis->m_nThreadStackFileReadFlag == 1) |
| | | // { |
| | | // if (pThis->m_nProcessState == RPS_CmdFileRead) //ì¤ííì¼ ì½ê¸° ìí [ê¹íí 2019/1/12] |
| | | // { |
| | | // strGlassID = pThis->m_strGlassID; |
| | | // |
| | | // pThis->m_nProcessState = RPS_StateFileRead; |
| | | // nThreadCount = 0; |
| | | // nReadFailCount = 0; |
| | | // AKLOG("RawMerge File Read Start : %s\\%s", pThis->m_strLocalPath, strGlassID); |
| | | // Sleep(3000); |
| | | // while (pThis->m_nProcessState == RPS_StateFileRead && pThis->m_nThreadStackFileReadFlag == 1) |
| | | // { |
| | | // if (pThis->openFile(strGlassID.GetBuffer(0)) == TRUE) |
| | | // { |
| | | // pThis->m_nProcessState = RPS_ResultReadOK; |
| | | // AKLOG("RawMerge File Read Complete "); |
| | | // break; |
| | | // } |
| | | // nReadFailCount++; |
| | | // AKLOG("RawMerge File Read Try : %d", nReadFailCount); |
| | | // if (nReadFailCount > 10) |
| | | // { |
| | | // pThis->m_nProcessState = RPS_ResultReadFail; |
| | | // break; |
| | | // } |
| | | // Sleep(50); |
| | | // } |
| | | // if (pThis->m_nProcessState != RPS_ResultReadOK) |
| | | // { |
| | | // pThis->m_nProcessState = RPS_ResultReadFail; |
| | | // } |
| | | // } |
| | | // if (nReadFailCount) |
| | | // Sleep(500); |
| | | // } |
| | | // pThis->m_nThreadStackFileReadFlag = 0; |
| | | m_nProcessState = RPS_StateFileRead; |
| | | int nReadFailCount = 0; |
| | | int nThreadCount = 0; |
| | | CString strGlassID; |
| | | |
| | | while (pThis->m_nThreadStackFileReadFlag == 1) |
| | | AKLOG("RawMerge File Read Start : %s\\%s", m_strLocalPath, m_strGlassID); |
| | | while (m_nProcessState == RPS_StateFileRead && m_nThreadStackFileReadFlag == 1) |
| | | { |
| | | if (pThis->m_nProcessState == RPS_CmdFileRead) //ì¤ííì¼ ì½ê¸° ìí [ê¹íí 2019/1/12] |
| | | if (openFile(m_strGlassID.GetBuffer(0)) == TRUE) |
| | | { |
| | | strGlassID = pThis->m_strGlassID; |
| | | |
| | | pThis->m_nProcessState = RPS_StateFileRead; |
| | | nThreadCount = 0; |
| | | nReadFailCount = 0; |
| | | |
| | | AKLOG("RawMerge File Read Start : %s\\%s", pThis->m_strLocalPath, strGlassID); |
| | | Sleep(3000); |
| | | while (pThis->m_nProcessState == RPS_StateFileRead && pThis->m_nThreadStackFileReadFlag == 1) |
| | | { |
| | | if (pThis->openFile(strGlassID.GetBuffer(0)) == TRUE) |
| | | { |
| | | pThis->m_nProcessState = RPS_ResultReadOK; |
| | | AKLOG("RawMerge File Read Complete "); |
| | | break; |
| | | } |
| | | nReadFailCount++; |
| | | AKLOG("RawMerge File Read Try : %d", nReadFailCount); |
| | | if (nReadFailCount > 10) |
| | | { |
| | | pThis->m_nProcessState = RPS_ResultReadFail; |
| | | break; |
| | | } |
| | | Sleep(50); |
| | | } |
| | | if (pThis->m_nProcessState != RPS_ResultReadOK) |
| | | { |
| | | pThis->m_nProcessState = RPS_ResultReadFail; |
| | | } |
| | | m_nProcessState = RPS_ResultReadOK; |
| | | AKLOG("RawMerge File Read Complete "); |
| | | break; |
| | | } |
| | | if (nReadFailCount) |
| | | Sleep(500); |
| | | nReadFailCount++; |
| | | if (nReadFailCount > 10) |
| | | { |
| | | m_nProcessState = RPS_ResultReadFail; |
| | | break; |
| | | } |
| | | AKLOG("RawMerge File Read Try : %d", nReadFailCount); |
| | | } |
| | | pThis->m_nThreadStackFileReadFlag = 0; |
| | | if (m_nProcessState != RPS_ResultReadOK) |
| | | { |
| | | m_nProcessState = RPS_ResultReadFail; |
| | | } |
| | | /*< SWK 20220413 - #4053 MOD End >*/ |
| | | } |
| | | /* <LJC 20211122 : #3820 ADD End> */ |
| | | BOOL CRawResultReader::RawMergeFileReadStart(char* pGlassID) |
| | | { |
| | | /*< SWK 20220413 - #4053 ADD Start >*/ |
| | | m_strGlassID = pGlassID; |
| | | m_nProcessState = RPS_CmdFileRead; |
| | | /*< SWK 20220413 - #4053 ADD End >*/ |
| | | |
| | | if (m_nThreadStackFileReadFlag == 0) |
| | | { |
| | | _beginthread(threadResultFileRead, NULL, this); |
| | |
| | | while (m_nProcessState == RPS_CmdFileStop) Sleep(0); |
| | | } |
| | | |
| | | m_strGlassID = pGlassID; |
| | | m_nProcessState = RPS_CmdFileRead; |
| | | /*< SWK 20220413 - #4053 DEL Start > |
| | | // m_strGlassID = pGlassID; |
| | | // m_nProcessState = RPS_CmdFileRead; |
| | | < SWK 20220413 - #4053 DEL End >*/ |
| | | |
| | | return TRUE; |
| | | } |
| | | /* <LJC 20211122 : #3820 ADD Start> */ |
| | | BOOL CRawResultReader::ProcessRawMergeFileReadStart(char * pGlassID) |
| | | { |
| | | |
| | | if (m_nThreadStackFileReadFlag == 0) |
| | | { |
| | | ProcessResultFileRead(this); |
| | | //< SWK 20220413 - #4053 MOD > |
| | | // ProcessResultFileRead(this); |
| | | ProcessResultFileRead(); |
| | | } |
| | | if (m_nProcessState == RPS_StateFileRead) |
| | | /*< SWK 20220413 - #4053 MOD Start >*/ |
| | | // if (m_nProcessState == RPS_StateFileRead) |
| | | // { |
| | | // m_nProcessState = RPS_CmdFileStop; |
| | | // while (m_nProcessState == RPS_CmdFileStop) Sleep(0); |
| | | // } |
| | | // |
| | | // m_strGlassID = pGlassID; |
| | | // m_nProcessState = RPS_CmdFileRead; |
| | | else |
| | | { |
| | | m_nProcessState = RPS_CmdFileStop; |
| | | while (m_nProcessState == RPS_CmdFileStop) Sleep(0); |
| | | } |
| | | if (m_nProcessState == RPS_StateFileRead) |
| | | { |
| | | m_nProcessState = RPS_CmdFileStop; |
| | | while (!(m_nProcessState == RPS_ResultReadOK || m_nProcessState == RPS_ResultReadFail)) Sleep(0); |
| | | } |
| | | |
| | | m_strGlassID = pGlassID; |
| | | m_nProcessState = RPS_CmdFileRead; |
| | | m_strGlassID = pGlassID; |
| | | m_nProcessState = RPS_CmdFileRead; |
| | | } |
| | | /*< SWK 20220413 - #4053 MOD End >*/ |
| | | |
| | | return TRUE; |
| | | } |
| | |
| | | BOOL openFile(char* pGlassID); |
| | | static void threadResultFileRead(void* pArg); |
| | | /* <LJC 20211122 : #3820 ADD Start> */ |
| | | static void ProcessResultFileRead(void* pArg); |
| | | //< SWK 20220413 - #4053 MOD > |
| | | // static void ProcessResultFileRead(void* pArg); |
| | | void ProcessResultFileRead(); |
| | | /* <LJC 20211122 : #3820 ADD End> */ |
| | | int m_nThreadStackFileReadFlag; |
| | | |
»õ ÆÄÀÏ |
| | |
| | | #include "stdafx.h" |
| | | #include "SelfDump.h" |
| | | #include <strsafe.h> |
| | | |
| | | // SelfDump를 ìí íë¼ë¯¸í° |
| | | static TCHAR g_szDumpPreFixName [MAX_PATH] = {0,}; |
| | | static TCHAR g_szDumpPath [MAX_PATH_SELFDUMP] = {0,}; |
| | | static DWORD g_dwDumpCapacityBytes = DEFAULT_DUMP_CAPACITY; |
| | | static MINIDUMP_TYPE g_nMiniDumpType = MiniDumpNormal; |
| | | static pfnCbOnCrash g_pfnCallback = NULL; |
| | | static LPVOID g_pUserData = NULL; |
| | | |
| | | CSelfDump::~CSelfDump() |
| | | { |
| | | |
| | | } |
| | | |
| | | CSelfDump::CSelfDump(IN LPCTSTR lpszDumpPreFixName/*=NULL*/, IN MINIDUMP_TYPE nMiniDumpType/*=MiniDumpNormal*/, IN DWORD dwDumpCapacityBytes/*=DEFAULT_DUMP_CAPACITY*/, IN LPCTSTR lpszDumpPath/*=NULL*/, IN pfnCbOnCrash pfnCallback/*=NULL*/, IN LPVOID lpUserData/*=NULL*/) |
| | | { |
| | | RegisterExceptionFilter(lpszDumpPreFixName, nMiniDumpType, dwDumpCapacityBytes, lpszDumpPath, pfnCallback, lpUserData); |
| | | } |
| | | |
| | | LONG CSelfDump::CbTopLevelExceptionFilter(struct _EXCEPTION_POINTERS *pExceptionInfo) |
| | | { |
| | | LONG lRtnValue = EXCEPTION_CONTINUE_SEARCH; |
| | | HANDLE hFile = INVALID_HANDLE_VALUE; |
| | | BOOL bRtnValue = FALSE; |
| | | TCHAR szPath[MAX_PATH_SELFDUMP] = {0,}; |
| | | HMODULE hDll = NULL; |
| | | LPFN_MinuDumpWriteDump pfn = NULL; |
| | | SYSTEMTIME stTime = {0,}; |
| | | _MINIDUMP_EXCEPTION_INFORMATION stExceptInfo = {0,}; |
| | | |
| | | // Dump Pathê° ì¡´ì¬íì§ ìëë¤ë©´, Pass |
| | | if (INVALID_FILE_ATTRIBUTES == ::GetFileAttributes(g_szDumpPath)) |
| | | { |
| | | // ë¡ê·¸ë ë¨ê¸°ì§ ìëë¡ íë¤. |
| | | lRtnValue = EXCEPTION_CONTINUE_SEARCH; |
| | | goto FINAL; |
| | | } |
| | | |
| | | // Callback ë±ë¡ ëì´ ìì¼ë©´ ì°ì í¸ì¶íë¤. |
| | | if (NULL != g_pfnCallback) |
| | | { |
| | | if (FALSE == (*g_pfnCallback)(g_pUserData)) |
| | | { |
| | | WriteLogFile(g_szDumpPath, TEXT(""), &stTime, g_szDumpPreFixName, FALSE); |
| | | lRtnValue = EXCEPTION_CONTINUE_SEARCH; |
| | | goto FINAL; |
| | | } |
| | | } |
| | | |
| | | // ë§ì½, MiniDumpTypeì´ -1 ì´ë¼ë©´,... ì¢
ë£ |
| | | if ((MINIDUMP_TYPE)-1 == g_nMiniDumpType) |
| | | { |
| | | WriteLogFile(g_szDumpPath, TEXT(""), &stTime, g_szDumpPreFixName, FALSE); |
| | | lRtnValue = EXCEPTION_CONTINUE_SEARCH; |
| | | goto FINAL; |
| | | } |
| | | |
| | | // DbgHelp.dllì ë¡ëíë¤. |
| | | hDll = CSelfDump::LoadLibrary_DbgHelp(); |
| | | if (NULL == hDll) |
| | | { |
| | | WriteLogFile(g_szDumpPath, TEXT(""), &stTime, g_szDumpPreFixName, FALSE); |
| | | lRtnValue = EXCEPTION_CONTINUE_SEARCH; |
| | | goto FINAL; |
| | | } |
| | | |
| | | // DbgHelp.dll::MinuDumpWriteDump(...)를 구íë¤. |
| | | pfn = (LPFN_MinuDumpWriteDump)::GetProcAddress(hDll, "MiniDumpWriteDump"); |
| | | if (NULL == pfn) |
| | | { |
| | | WriteLogFile(g_szDumpPath, TEXT(""), &stTime, g_szDumpPreFixName, FALSE); |
| | | lRtnValue = EXCEPTION_CONTINUE_SEARCH; |
| | | goto FINAL; |
| | | } |
| | | |
| | | // Dump íì¼ ì´ë¦ì 구íë¤. |
| | | if (FALSE == CSelfDump::GetDumpFileFullPathName(g_szDumpPath, |
| | | g_szDumpPreFixName, |
| | | szPath, |
| | | MAX_PATH_SELFDUMP, |
| | | &stTime)) |
| | | { |
| | | ::GetLocalTime(&stTime); |
| | | WriteLogFile(g_szDumpPath, TEXT(""), &stTime, g_szDumpPreFixName, FALSE); |
| | | lRtnValue = EXCEPTION_CONTINUE_SEARCH; |
| | | goto FINAL; |
| | | } |
| | | |
| | | // Dump íì¼ì Create íë¤. |
| | | hFile = ::CreateFile(szPath, |
| | | GENERIC_WRITE, |
| | | 0, |
| | | NULL, |
| | | CREATE_ALWAYS, |
| | | FILE_ATTRIBUTE_NORMAL, |
| | | NULL); |
| | | if (INVALID_HANDLE_VALUE == hFile) |
| | | { |
| | | WriteLogFile(g_szDumpPath, szPath, &stTime, g_szDumpPreFixName, FALSE); |
| | | lRtnValue = EXCEPTION_CONTINUE_SEARCH; |
| | | goto FINAL; |
| | | } |
| | | |
| | | // ë¤í ìì±ì ìí ë³ì ì´ê¸°í |
| | | stExceptInfo.ThreadId = ::GetCurrentThreadId(); |
| | | stExceptInfo.ExceptionPointers = pExceptionInfo; |
| | | stExceptInfo.ClientPointers = NULL; |
| | | |
| | | // Dump File ë¤ì manageíì¬ íì¼ë±ì ìì íë¤. |
| | | if (FALSE == CSelfDump::ManageCapacity(g_szDumpPath, |
| | | g_szDumpPreFixName, |
| | | g_dwDumpCapacityBytes)) |
| | | { |
| | | WriteLogFile(g_szDumpPath, szPath, &stTime, g_szDumpPreFixName, FALSE); |
| | | lRtnValue = EXCEPTION_CONTINUE_SEARCH; |
| | | goto FINAL; |
| | | } |
| | | |
| | | // Dump ìì± |
| | | bRtnValue = (*pfn)(::GetCurrentProcess(), |
| | | ::GetCurrentProcessId(), |
| | | hFile, |
| | | MiniDumpNormal, |
| | | &stExceptInfo, |
| | | NULL, |
| | | NULL); |
| | | if (TRUE == bRtnValue) |
| | | { |
| | | WriteLogFile(g_szDumpPath, szPath, &stTime, g_szDumpPreFixName, TRUE); |
| | | |
| | | // EXCEPTION_EXECUTE_HANDLER ì¼ë¡ íë©´, |
| | | // drwtsn32.exeì ê°ì ëë²ê±°ë¥¼ íµí ë¤íê° ë¨ì§ ìëë¤. |
| | | // lRtnValue = EXCEPTION_EXECUTE_HANDLER; |
| | | lRtnValue = EXCEPTION_CONTINUE_SEARCH; |
| | | } |
| | | else |
| | | { |
| | | WriteLogFile(g_szDumpPath, szPath, &stTime, g_szDumpPreFixName, FALSE); |
| | | lRtnValue = EXCEPTION_CONTINUE_SEARCH; |
| | | } |
| | | |
| | | FINAL: |
| | | |
| | | if (INVALID_HANDLE_VALUE != hFile) |
| | | { |
| | | ::CloseHandle(hFile); |
| | | hFile = INVALID_HANDLE_VALUE; |
| | | pfn = NULL; |
| | | } |
| | | |
| | | if (NULL != hDll) |
| | | { |
| | | ::FreeLibrary(hDll); |
| | | hDll = NULL; |
| | | pfn = NULL; |
| | | } |
| | | |
| | | return lRtnValue; |
| | | } |
| | | |
| | | VOID CSelfDump::SetMiniDumpTypeWhenExist(IN LPCTSTR lpszRegKeyPath, IN LPCTSTR lpszValueName) |
| | | { |
| | | HKEY hKey = NULL; |
| | | LONG lRtnValue = 0; |
| | | DWORD dwType = 0; |
| | | DWORD dwCbSize = 0; |
| | | DWORD dwValue = 0; |
| | | |
| | | if ((NULL == lpszRegKeyPath) || (NULL == lpszValueName)) |
| | | { |
| | | goto FINAL; |
| | | } |
| | | |
| | | lRtnValue = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, |
| | | lpszRegKeyPath, |
| | | 0, |
| | | KEY_READ, |
| | | &hKey); |
| | | if (ERROR_SUCCESS != lRtnValue) |
| | | { |
| | | goto FINAL; |
| | | } |
| | | |
| | | dwType = REG_DWORD; |
| | | dwCbSize = sizeof(dwValue); |
| | | lRtnValue = ::RegQueryValueEx(hKey, |
| | | lpszValueName, |
| | | NULL, |
| | | &dwType, |
| | | (LPBYTE)&dwValue, |
| | | &dwCbSize); |
| | | if (ERROR_SUCCESS != lRtnValue) |
| | | { |
| | | goto FINAL; |
| | | } |
| | | |
| | | g_nMiniDumpType = (MINIDUMP_TYPE)dwValue; |
| | | |
| | | FINAL: |
| | | if (NULL != hKey) |
| | | { |
| | | ::RegCloseKey(hKey); |
| | | hKey = NULL; |
| | | } |
| | | } |
| | | |
| | | VOID CSelfDump::WriteLogFile(IN LPCTSTR lpszPath, IN LPCTSTR lpszDumpFileFullPathName, IN PSYSTEMTIME pstTimeOccur, IN LPCTSTR lpszDumpPrefixName, IN BOOL bWriteDumpSuccess) |
| | | { |
| | | TCHAR szLogPath[MAX_PATH_SELFDUMP] = {0,}; |
| | | TCHAR szSection[MAX_PATH] = {0,}; |
| | | TCHAR szTmp [MAX_PATH] = {0,}; |
| | | |
| | | if ((NULL == lpszPath) || (NULL == lpszDumpFileFullPathName) || (NULL == pstTimeOccur) || (NULL == lpszDumpPrefixName)) |
| | | { |
| | | return; |
| | | } |
| | | |
| | | StringCchPrintf(szLogPath, MAX_PATH_SELFDUMP, TEXT("%s\\CrashDmp.log"), lpszPath); |
| | | StringCchPrintf(szSection, MAX_PATH, TEXT("%.4d%.2d%.2d_%.2d%.2d%.2d%.3d"), pstTimeOccur->wYear, pstTimeOccur->wMonth, pstTimeOccur->wDay, pstTimeOccur->wHour, pstTimeOccur->wMinute, pstTimeOccur->wSecond, pstTimeOccur->wMilliseconds); |
| | | |
| | | ::WritePrivateProfileString(szSection, TEXT("Prefix"), lpszDumpPrefixName, szLogPath); |
| | | ::WritePrivateProfileString(szSection, TEXT("DumpPath"), lpszDumpFileFullPathName, szLogPath); |
| | | |
| | | StringCchPrintf(szTmp, MAX_PATH, TEXT("%d"), ::GetCurrentProcessId()); |
| | | ::WritePrivateProfileString(szSection, TEXT("ProcessId"), szTmp, szLogPath); |
| | | |
| | | ::GetModuleFileName(NULL, szTmp, MAX_PATH); |
| | | ::WritePrivateProfileString(szSection, TEXT("CrashModulePath"), szTmp, szLogPath); |
| | | |
| | | if (TRUE == bWriteDumpSuccess) |
| | | { |
| | | ::WritePrivateProfileString(szSection, TEXT("SuccessWriteDump"), TEXT("yes"), szLogPath); |
| | | } |
| | | else |
| | | { |
| | | ::WritePrivateProfileString(szSection, TEXT("SuccessWriteDump"), TEXT("no"), szLogPath); |
| | | } |
| | | } |
| | | |
| | | BOOL CSelfDump::RegisterExceptionFilter(IN LPCTSTR lpszDumpPreFixName/*=NULL*/, IN MINIDUMP_TYPE nMiniDumpType/*=MiniDumpNormal*/, IN DWORD dwDumpCapacityBytes/*=DEFAULT_DUMP_CAPACITY*/, IN LPCTSTR lpszDumpPath/*=NULL*/, IN pfnCbOnCrash pfnCallback/*=NULL*/, IN LPVOID lpUserData/*=NULL*/) |
| | | { |
| | | BOOL bRtnValue = TRUE; |
| | | DWORD dwRtnValue = 0; |
| | | |
| | | // íë¼ë¯¸í°ë¤ë¥¼ ë³µì¬íë¤. |
| | | if (NULL != lpszDumpPreFixName) |
| | | { |
| | | StringCchCopy(g_szDumpPreFixName, MAX_PATH, lpszDumpPreFixName); |
| | | } |
| | | else |
| | | { |
| | | GetDefaultDumpPreFixName(g_szDumpPreFixName, MAX_PATH); |
| | | } |
| | | |
| | | if (DEFAULT_DUMP_CAPACITY != dwDumpCapacityBytes) |
| | | { |
| | | g_dwDumpCapacityBytes = dwDumpCapacityBytes; |
| | | } |
| | | |
| | | if (NULL != lpszDumpPath) |
| | | { |
| | | StringCchCopy(g_szDumpPath, MAX_PATH_SELFDUMP, lpszDumpPath); |
| | | } |
| | | else |
| | | { |
| | | // NULL --> Default Path ( <.exeì ModulePath>\Temp ) |
| | | dwRtnValue = CSelfDump::GetDefaultModuleTempPath(g_szDumpPath, MAX_PATH_SELFDUMP); |
| | | if (ERROR_SUCCESS != dwRtnValue) |
| | | { |
| | | bRtnValue = FALSE; |
| | | goto FINAL; |
| | | } |
| | | } |
| | | |
| | | g_nMiniDumpType = nMiniDumpType; |
| | | g_pfnCallback = pfnCallback; |
| | | g_pUserData = lpUserData; |
| | | |
| | | // Exception Filter를 ë±ë¡íë¤. |
| | | ::SetUnhandledExceptionFilter(CSelfDump::CbTopLevelExceptionFilter); |
| | | |
| | | bRtnValue = TRUE; |
| | | |
| | | FINAL: |
| | | return bRtnValue; |
| | | } |
| | | |
| | | BOOL CSelfDump::GetDumpFileFullPathName(IN LPCTSTR lpszPath, IN LPCTSTR lpszDumpPreFixName, OUT LPTSTR lpszDumpFileFullPathName, IN DWORD dwCchDumpFileFullPathName, OUT PSYSTEMTIME pstTime) |
| | | { |
| | | BOOL bRtnValue = TRUE; |
| | | |
| | | if ((NULL == lpszPath) || |
| | | (NULL == lpszDumpPreFixName) || |
| | | (NULL == lpszDumpFileFullPathName) || |
| | | (NULL == pstTime)) |
| | | { |
| | | bRtnValue = FALSE; |
| | | goto FINAL; |
| | | } |
| | | |
| | | ::GetLocalTime(pstTime); |
| | | StringCchPrintf(lpszDumpFileFullPathName, |
| | | dwCchDumpFileFullPathName, |
| | | TEXT("%s\\%s_%.4d%.2d%.2d%.2d%.2d%.2d.dmp"), |
| | | lpszPath, |
| | | lpszDumpPreFixName, |
| | | pstTime->wYear, |
| | | pstTime->wMonth, |
| | | pstTime->wDay, |
| | | pstTime->wHour, |
| | | pstTime->wMinute, |
| | | pstTime->wSecond); |
| | | bRtnValue = TRUE; |
| | | FINAL: |
| | | return bRtnValue; |
| | | } |
| | | |
| | | DWORD CSelfDump::GetFilesSize(IN LPCTSTR lpszFindFileName, OUT LPTSTR lpszEarlyFileName, IN DWORD dwCchEarlyFileName) |
| | | { |
| | | HANDLE hFind = INVALID_HANDLE_VALUE; |
| | | DWORD dwTotalBytes = 0; |
| | | WIN32_FIND_DATA FindFileData = {0,}; |
| | | |
| | | dwTotalBytes = 0; |
| | | |
| | | if ((NULL == lpszFindFileName) || (NULL == lpszEarlyFileName)) |
| | | { |
| | | goto FINAL; |
| | | } |
| | | |
| | | ZeroMemory(lpszEarlyFileName, sizeof(TCHAR) * dwCchEarlyFileName); |
| | | |
| | | // Enum File íë¤. |
| | | hFind = ::FindFirstFile(lpszFindFileName, &FindFileData); |
| | | if (hFind == INVALID_HANDLE_VALUE) |
| | | { |
| | | dwTotalBytes = 0; |
| | | goto FINAL; |
| | | } |
| | | |
| | | if (TEXT('.') != FindFileData.cFileName[0]) |
| | | { |
| | | dwTotalBytes += FindFileData.nFileSizeLow; |
| | | StringCchCopy(lpszEarlyFileName, dwCchEarlyFileName, FindFileData.cFileName); |
| | | } |
| | | |
| | | while (FindNextFile(hFind, &FindFileData) != 0) |
| | | { |
| | | if (TEXT('.') == FindFileData.cFileName[0]) |
| | | { |
| | | continue; |
| | | } |
| | | |
| | | // íì¼ í¬ê¸°ë¥¼ ê³ì ëí´ ëê°ë¤. |
| | | // (ì¤ë§ nFileHighSizeë 0ì´ê² ì§?) |
| | | dwTotalBytes += FindFileData.nFileSizeLow; |
| | | |
| | | if (TEXT('\0') == lpszEarlyFileName[0]) |
| | | { |
| | | StringCchCopy(lpszEarlyFileName, dwCchEarlyFileName, FindFileData.cFileName); |
| | | continue; |
| | | } |
| | | |
| | | if (0 < _tcscmp(lpszEarlyFileName, FindFileData.cFileName)) |
| | | { |
| | | StringCchCopy(lpszEarlyFileName, dwCchEarlyFileName, FindFileData.cFileName); |
| | | } |
| | | } |
| | | |
| | | FINAL: |
| | | |
| | | if (INVALID_HANDLE_VALUE != hFind) |
| | | { |
| | | ::FindClose(hFind); |
| | | hFind = INVALID_HANDLE_VALUE; |
| | | } |
| | | |
| | | return dwTotalBytes; |
| | | } |
| | | |
| | | BOOL CSelfDump::ManageCapacity(IN LPCTSTR lpszPath, IN LPCTSTR lpszDumpPreFixName, IN DWORD dwDumpCapacityBytes) |
| | | { |
| | | INT i = 0; |
| | | BOOL bRtnValue = FALSE; |
| | | DWORD dwCbFileSize = 0; |
| | | TCHAR szFileName[MAX_PATH_SELFDUMP] = {0,}; |
| | | TCHAR szDelFileName[MAX_PATH_SELFDUMP] = {0,}; |
| | | TCHAR szEarlyFileName[MAX_PATH_SELFDUMP] = {0,}; |
| | | |
| | | if ((NULL == lpszPath) || (NULL == lpszDumpPreFixName)) |
| | | { |
| | | bRtnValue = FALSE; |
| | | goto FINAL; |
| | | } |
| | | |
| | | // Path를 ê²°ì íë¤. |
| | | StringCchPrintf(szFileName, |
| | | MAX_PATH_SELFDUMP, |
| | | TEXT("%s\\%s_*.dmp"), |
| | | lpszPath, |
| | | lpszDumpPreFixName); |
| | | |
| | | // í꺼ë²ì 32ê°ì ë¤ííì¼ì ìì í ì ìë¤. |
| | | for (i=0; i<MAX_DEL_TRY_MANAGE; i++) |
| | | { |
| | | dwCbFileSize = CSelfDump::GetFilesSize(szFileName, |
| | | szEarlyFileName, |
| | | MAX_PATH_SELFDUMP); |
| | | |
| | | if (dwCbFileSize < g_dwDumpCapacityBytes) |
| | | { |
| | | break; |
| | | } |
| | | |
| | | // ìì íë¤. |
| | | StringCchPrintf(szDelFileName, MAX_PATH_SELFDUMP, TEXT("%s\\%s"), g_szDumpPath, szEarlyFileName); |
| | | ::DeleteFile(szDelFileName); |
| | | } |
| | | |
| | | bRtnValue = TRUE; |
| | | |
| | | FINAL: |
| | | |
| | | return bRtnValue; |
| | | } |
| | | |
| | | HMODULE CSelfDump::LoadLibrary_DbgHelp(VOID) |
| | | { |
| | | HMODULE hDLL = NULL; |
| | | TCHAR szDbgHelp[MAX_PATH_SELFDUMP] = {0,}; |
| | | LPTSTR lpszFound = NULL; |
| | | |
| | | if (0 != ::GetModuleFileName(NULL, szDbgHelp, MAX_PATH_SELFDUMP)) |
| | | { |
| | | // .exeì Pathì DbgHelp.dllì´ ìë¤ë©´, ì´ê²ì LoadLibrary íë¤. |
| | | lpszFound = _tcsrchr(szDbgHelp, TEXT('\\')); |
| | | if ((NULL != lpszFound) && (szDbgHelp < lpszFound)) |
| | | { |
| | | *lpszFound = TEXT('\0'); |
| | | StringCchCat(szDbgHelp, MAX_PATH_SELFDUMP, TEXT("\\DbgHelp.dll")); |
| | | |
| | | hDLL = ::LoadLibrary(szDbgHelp); |
| | | if (NULL != hDLL) |
| | | { |
| | | // success! |
| | | goto FINAL; |
| | | } |
| | | } |
| | | } |
| | | |
| | | // System32 í´ëë¡ ë¶í° dbghelp.dllì LoadLibrary íë¤. |
| | | hDLL = CSelfDump::LoadLibraryFromSystem(TEXT("DbgHelp.dll")); |
| | | |
| | | FINAL: |
| | | return hDLL; |
| | | } |
| | | |
| | | HMODULE CSelfDump::LoadLibraryFromSystem(IN LPCTSTR lpFileName) |
| | | { |
| | | if( NULL == lpFileName ) { |
| | | return NULL; |
| | | } |
| | | |
| | | if( 0 == lpFileName[0] ) { |
| | | return NULL; |
| | | } |
| | | |
| | | const int BUF_SIZ = 4096; |
| | | |
| | | LPTSTR lpszSysDir = NULL; |
| | | UINT nNeedSize = GetSystemDirectory( NULL, 0 ); |
| | | lpszSysDir = (LPTSTR)malloc( (nNeedSize + 1) * sizeof(TCHAR) ); |
| | | if( NULL == lpszSysDir ) { |
| | | return NULL; |
| | | } |
| | | |
| | | if( 0 == GetSystemDirectory( lpszSysDir, nNeedSize + 1 ) ) { |
| | | free( lpszSysDir ); |
| | | lpszSysDir = NULL; |
| | | return NULL; |
| | | } |
| | | |
| | | TCHAR szFullPath[BUF_SIZ] = {0,}; |
| | | _tcsncpy( szFullPath, lpszSysDir, BUF_SIZ ); |
| | | _tcsncat( szFullPath, _T("\\"), BUF_SIZ ); |
| | | _tcsncat( szFullPath, lpFileName, BUF_SIZ ); |
| | | |
| | | HMODULE hModule = LoadLibraryEx( szFullPath, NULL, LOAD_WITH_ALTERED_SEARCH_PATH ); |
| | | |
| | | free( lpszSysDir ); |
| | | lpszSysDir = NULL; |
| | | |
| | | if( hModule ) { |
| | | return hModule; |
| | | } |
| | | |
| | | return NULL; |
| | | } |
| | | |
| | | DWORD CSelfDump::GetDefaultModuleTempPath(OUT LPTSTR lpszPath, IN DWORD dwCchPath) |
| | | { |
| | | DWORD dwRtnValue = ERROR_SUCCESS; |
| | | LPTSTR lpszFound = NULL; |
| | | |
| | | if (NULL == lpszPath) |
| | | { |
| | | dwRtnValue = ERROR_INVALID_PARAMETER; |
| | | goto FINAL; |
| | | } |
| | | |
| | | // Clean Up |
| | | ZeroMemory(lpszPath, sizeof(TCHAR) * dwCchPath); |
| | | |
| | | if (0 == ::GetModuleFileName(NULL, lpszPath, dwCchPath)) |
| | | { |
| | | // Module Handle 구íëë° ì¤í¨ |
| | | dwRtnValue = ::GetLastError(); |
| | | goto FINAL; |
| | | } |
| | | |
| | | lpszFound = _tcsrchr(lpszPath, TEXT('\\')); |
| | | if (NULL == lpszFound) |
| | | { |
| | | // Path ëì \ê° ìì? |
| | | dwRtnValue = ERROR_PATH_NOT_FOUND; |
| | | goto FINAL; |
| | | } |
| | | |
| | | if (lpszFound <= lpszPath) |
| | | { |
| | | // Path ëì \ê° ìì? |
| | | dwRtnValue = ERROR_PATH_NOT_FOUND; |
| | | goto FINAL; |
| | | } |
| | | |
| | | // Null 문ìë¡ ë§ë¤ì´ì¤ |
| | | *lpszFound = TEXT('\0'); |
| | | |
| | | // Temp í´ë를 ì¶ê°í´ì¤ |
| | | StringCchCat(lpszPath, dwCchPath, TEXT("\\Temp")); |
| | | |
| | | // ì¬ê¸°ê¹ì§ ìë¤ë©´, ì±ê³µ |
| | | dwRtnValue = ERROR_SUCCESS; |
| | | |
| | | FINAL: |
| | | return dwRtnValue; |
| | | } |
| | | |
| | | DWORD CSelfDump::GetDefaultDumpPreFixName(OUT LPTSTR lpszDefaultDumpPreFixName, IN DWORD dwCchDefaultDumpPreFixName) |
| | | { |
| | | DWORD dwRtnValue = ERROR_SUCCESS; |
| | | TCHAR szModulePath[MAX_PATH_SELFDUMP] = {0,}; |
| | | LPTSTR lpszFound = NULL; |
| | | LPTSTR lpszIter = NULL; |
| | | BOOL bFound = FALSE; |
| | | INT i = 0; |
| | | |
| | | // ì¤í .exeì íì¼ì´ë¦ (íì¥ì ì ì¸)를 dumpfileì prefixë¡ ê²°ì íë¤. |
| | | if (NULL == lpszDefaultDumpPreFixName) |
| | | { |
| | | dwRtnValue = ERROR_INVALID_PARAMETER; |
| | | goto FINAL; |
| | | } |
| | | |
| | | ZeroMemory(lpszDefaultDumpPreFixName, sizeof(TCHAR)*dwCchDefaultDumpPreFixName); |
| | | |
| | | if (0 == ::GetModuleFileName(NULL, szModulePath, MAX_PATH_SELFDUMP)) |
| | | { |
| | | dwRtnValue = ::GetLastError(); |
| | | StringCchPrintf(lpszDefaultDumpPreFixName, dwCchDefaultDumpPreFixName, TEXT("UnKnown")); |
| | | goto FINAL; |
| | | } |
| | | |
| | | lpszFound = _tcsrchr(szModulePath, TEXT('\\')); |
| | | if ((NULL == lpszFound) || (lpszFound <= szModulePath) || (TEXT('\0') == *(lpszFound+1))) |
| | | { |
| | | dwRtnValue = ERROR_PATH_NOT_FOUND; |
| | | StringCchPrintf(lpszDefaultDumpPreFixName, dwCchDefaultDumpPreFixName, TEXT("UnKnown")); |
| | | goto FINAL; |
| | | } |
| | | |
| | | // íì¥ì를 ì ë¨íë¤. |
| | | bFound = FALSE; |
| | | for (i=0; i<MAX_PATH; i++) |
| | | { |
| | | if (TEXT('\0') == *(lpszFound+i)) |
| | | { |
| | | break; |
| | | } |
| | | |
| | | if (TEXT('.') == *(lpszFound+i)) |
| | | { |
| | | bFound = TRUE; |
| | | *(lpszFound+i) = TEXT('\0'); |
| | | break; |
| | | } |
| | | } |
| | | |
| | | if (FALSE == bFound) |
| | | { |
| | | dwRtnValue = ERROR_PATH_NOT_FOUND; |
| | | StringCchPrintf(lpszDefaultDumpPreFixName, dwCchDefaultDumpPreFixName, TEXT("UnKnown")); |
| | | goto FINAL; |
| | | } |
| | | |
| | | dwRtnValue = ERROR_SUCCESS; |
| | | StringCchCopy(lpszDefaultDumpPreFixName, dwCchDefaultDumpPreFixName, lpszFound + 1); |
| | | |
| | | FINAL: |
| | | return dwRtnValue; |
| | | } |
»õ ÆÄÀÏ |
| | |
| | | #include <dbghelp.h> |
| | | |
| | | ////////////////////////////////////////////////////////////////////////// |
| | | // |
| | | // ì¬ì©ì: |
| | | // |
| | | // #include "selfdump.h" |
| | | // |
| | | // winmain() |
| | | // { |
| | | // ... |
| | | // // ëëµ ì´ê¸°ì... |
| | | // CSelfDump::RegisterExectionFilter(); // <- ì½ëë¡ ì¤í |
| | | // .. |
| | | // } |
| | | // |
| | | // í¹ì |
| | | // |
| | | // CApp theApp; |
| | | // ... |
| | | // CSelfDump g_cSelfDump(); // <- ì ì ë³ìë¡ ì¤í |
| | | // .. |
| | | // |
| | | // ==> ë§ì½, TestApp.exeìì Crashê° ë°ìíë©´, |
| | | // (íë¼ë¯¸í°ë¥¼ default ê°ì¼ë¡ ì ì½ëì ê°ì´ ì§ì íìë), |
| | | // |
| | | // * TestApp.exe Pathì Temp í´ëê° ìë ê²½ì°, 미ë ë¤íì¸ TestApp_yyyymmddhhmmssmmm.dmpê° ìì±ëë¤. |
| | | // * TestApp.exe Pathì Temp í´ëê° ìë ê²½ì°, ë¤í를 ë¨ê¸°ì§ ìëë¤. |
| | | // * TestApp_*.dmpì Total íì¼ í¬ê¸°ê° 1MB를 ëì´ê°ë©´, ê°ì¥ ìë ê»ì ì§ìì ë¤í를 ë§ë¤ì´ í¬ê¸°ë¥¼ ì ì§íë¤. |
| | | // * TestApp.exe Pathì Temp í´ëì CrashDmp.log íì¼ì ì¤ë¥ ì¬íë¤ì 기ë¡íë¤. |
| | | // * XP/Vistaì¸ ê²½ì°, 기존ì ëë²ê±°ë¡ë ì°ê²°ì´ ëë¤. (drwtsn32, Problem Reports and Solutions ì§ì) |
| | | // |
| | | // (ì림) minidump ìì±ì´ë¯ë¡, !analyze -v ì ëë¡ ì¬ì©ë ì ìë¤. |
| | | // (ì림) TestApp.exeê° Userê³ì ìì ì¤íë ì ìì¼ë¯ë¡, Temp í´ëë everyone 777 ê¶íì´ ìëê²ì´ ì¢ì ê²ì´ë¤. |
| | | // (ì림) CSelfDump í¨ìêµ°ì Thread Safe ë³´ì¥ì´ ìë¤. ë°ë¼ì, .exe ì¤í ì´ê¸°íë ëëë¡ ë¨ íë²ë§ í¸ì¶íëë¡ íë¤. |
| | | // (ì림) dbghelp.dllì ì¬ì©íëë°, ì¤í .exeì module path ë¤ì system32 path ììë¡ LoadLibrary를 ìëíë¤. |
| | | // |
| | | ////////////////////////////////////////////////////////////////////////// |
| | | |
| | | ////////////////////////////////////////////////////////////////////////// |
| | | // |
| | | // Parameter : |
| | | // |
| | | // CSelfDump::CSelfDump(...) / CSelfDump::RegisterExectionFilter(...) |
| | | // ì Argument를 ì¤ëª
íë¤. |
| | | // |
| | | // * lpszDumpPreFixName : ë¤ííì¼ì ì´ë¦ì ì§ì íë¤. ì§ì ëì§ ìë ê²½ì°, ì¤í .exeì íì¼ëª
ì´ ëë¤. |
| | | // ex) "abc"ë¡ ì§ì íë ê²½ì°, abc_yyyymmddhhmmssmmm.dmp íì¼ëª
ì¼ë¡ ê°ì ì§ì ëë¤. |
| | | // |
| | | // * nMiniDumpType : ë¤ííì¼ì íì
ì§ì . 기본ê°ì MiniDumpNormalì´ë¤. |
| | | // **) íì
ì http://msdn.microsoft.com/en-us/library/ms680519(VS.85).aspx ìì ì°¸ê³ íìì¤. |
| | | // |
| | | // * dwDumpCapacityBytes : PreFixNameì¼ë¡ ë§ë¤ì´ì§ ë¤ííì¼ë¤ì´ ì ì§ë íì¼ í¬ê¸°. 기본ê°ì 1048576(1MB)ì´ë¤. |
| | | // **) ë¤í를 ë§ë¤ê¸° ì ì í¬ê¸°ë¥¼ íì¸íì¬, ëì´ê°ë ê²½ì° ê°ì¥ ìë ê²ì ì°¨ë¡ë¡ ì§ìì í¬ê¸°ë¥¼ ì¼ì íê² ì ì§íë¤. |
| | | // |
| | | // * lpszDumpPath : ë¤ííì¼ì ìì±í Path. 기본ê°ì .exeì Path íë¶ì Temp í´ëì´ë¤. |
| | | // ex) 기본ê°ì¸ ê²½ì°, C:\ttt\abc.exeë C:\ttt\temp\abc_~~~~.dmpë¡ ì ì¥ëë¤) |
| | | // |
| | | // * pfnCallback / pfnUserData : ë¤ííì¼ì ë§ë¤ê¸° ì ì í¸ì¶ë°ì ì ìë callbackì ë±ë¡. 기본ê°ì NULL |
| | | // **) callback í¸ì¶ë°ì UI를 ëì ì¤ ì ìë¤. FALSE를 리í´íë©´ ë¤í를 ë¨ê¸°ì§ ìëë¤. |
| | | // |
| | | ////////////////////////////////////////////////////////////////////////// |
| | | |
| | | ////////////////////////////////////////////////////////////////////////// |
| | | // |
| | | // Tool : |
| | | // |
| | | // * CSelfDump::SetMiniDumpTypeWhenExist(...) |
| | | // **) nMiniDumpTypeì ë ì§ì¤í¸ë¦¬ ê°ì¼ë¡ ì¸í
íë¤. (ë ì§ì¤í¸ë¦¬ ê°ì´ ìëê²½ì°ë§ í´ë¹) |
| | | // ex) CSelfDump::RegisterExectionFilter(..., MiniDumpScanMemory, ...); |
| | | // CSelfDump::SetMiniDumpTypeWhenExist(TEXT("Sofware\....\Tmp", TEXT("minidumptype")); |
| | | // ì¸ ê²½ì°, ë§ì½ ë ì§ì¤í¸ë¦¬ì ê°ì´ ìë¤ë©´, MiniDumpScanMemoryê°ìì ë ì§ì¤í¸ë¦¬ ê°ì¼ë¡ ë³ê²½ëë¤. |
| | | // ë§ì½, í´ë¹ ê°ì´ (DWORD)-1ì¸ ê²½ì°ìë, ë¤í를 ë¨ê¸°ì§ ìëë¡ ìì¸ ì²ë¦¬ëìë¤. |
| | | // |
| | | ////////////////////////////////////////////////////////////////////////// |
| | | |
| | | // dbghelp.dll::MinuDumpWriteDump(...)ì prototype |
| | | typedef BOOL (WINAPI *LPFN_MinuDumpWriteDump) (HANDLE hProcess, |
| | | DWORD dwPid, |
| | | HANDLE hFile, |
| | | MINIDUMP_TYPE DumpType, |
| | | PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, |
| | | PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, |
| | | PMINIDUMP_CALLBACK_INFORMATION CallbackParam); |
| | | |
| | | // Crash ë°ìë í¸ì¶ëë Callbackì Prototype |
| | | // FALSE를 리í´íë©´, ë¤í를 ë¨ê¸°ì§ ìëë¤. |
| | | typedef BOOL (*pfnCbOnCrash) (IN LPVOID lpUserData); |
| | | |
| | | // Capacityì ë§ì¶° íì¼ì ìì íê³ write dump íë¯ë¡, Total ì©ëì ìµë (1MB + ë§ì§ë§ Dump File í¬ê¸°) ê° ë ì ìë¤. |
| | | #define DEFAULT_DUMP_CAPACITY 1048576 // 1MB |
| | | |
| | | // ë¤í íì¼ manage를 ìí´, í꺼ë²ì ìì ë íì¼ ê°ì |
| | | #define MAX_DEL_TRY_MANAGE 32 |
| | | |
| | | #define MAX_PATH_SELFDUMP 1024 |
| | | |
| | | class CSelfDump |
| | | { |
| | | public: |
| | | CSelfDump(IN LPCTSTR lpszDumpPreFixName = NULL, IN MINIDUMP_TYPE nMiniDumpType = MiniDumpNormal, IN DWORD dwDumpCapacityBytes = DEFAULT_DUMP_CAPACITY, IN LPCTSTR lpszDumpPath = NULL, IN pfnCbOnCrash pfnCallback = NULL, IN LPVOID lpUserData = NULL); |
| | | virtual ~CSelfDump(); |
| | | |
| | | public: |
| | | static BOOL RegisterExceptionFilter (IN LPCTSTR lpszDumpPreFixName = NULL, IN MINIDUMP_TYPE nMiniDumpType = MiniDumpNormal, IN DWORD dwDumpCapacityBytes = DEFAULT_DUMP_CAPACITY, IN LPCTSTR lpszDumpPath = NULL, IN pfnCbOnCrash pfnCallback = NULL, IN LPVOID lpUserData = NULL); |
| | | static VOID SetMiniDumpTypeWhenExist (IN LPCTSTR lpszRegKeyPath, IN LPCTSTR lpszValueName); |
| | | |
| | | private: |
| | | static LONG WINAPI CbTopLevelExceptionFilter(struct _EXCEPTION_POINTERS *pExceptionInfo); |
| | | static VOID WriteLogFile (IN LPCTSTR lpszPath, IN LPCTSTR lpszDumpFileFullPathName, IN PSYSTEMTIME pstTimeOccur, IN LPCTSTR lpszDumpPrefixName, IN BOOL bWriteDumpSuccess); |
| | | |
| | | // Utility |
| | | private: |
| | | static DWORD GetDefaultDumpPreFixName(OUT LPTSTR lpszDefaultDumpPreFixName, IN DWORD dwCchDefaultDumpPreFixName); |
| | | static DWORD GetDefaultModuleTempPath(OUT LPTSTR lpszPath, IN DWORD dwCchPath); |
| | | static HMODULE LoadLibrary_DbgHelp (VOID); |
| | | static HMODULE LoadLibraryFromSystem (IN LPCTSTR lpFileName); |
| | | static BOOL ManageCapacity (IN LPCTSTR lpszPath, IN LPCTSTR lpszDumpPreFixName, IN DWORD dwDumpCapacityBytes); |
| | | static BOOL GetDumpFileFullPathName (IN LPCTSTR lpszPath, IN LPCTSTR lpszDumpPreFixName, OUT LPTSTR lpszDumpFileFullPathName, IN DWORD dwCchDumpFileFullPathName, OUT PSYSTEMTIME pstTime); |
| | | static DWORD GetFilesSize (IN LPCTSTR lpszFindFileName, OUT LPTSTR lpszEarlyFileName, IN DWORD dwCchEarlyFileName); |
| | | }; |
| | |
| | | #define RAWMESSENGER_MAXCAMNUM 30 |
| | | #define RAWMESSENGER_MAXSCANNUM 20 |
| | | #define RAWMESSENGER_MAXHLINUM 8 |
| | | #define RAW_CODE_MAX 10 |
| | | |
| | | #define MAX_ZONE_NUM 16 |
| | | |
| | |
| | | int m_nDefectNumTypeMD; |
| | | int m_nDefectNumTypeCD; |
| | | int m_nDefectNumTypeMC; |
| | | /* <LJC 20220422 : #3957 ADD Start> */ |
| | | int m_nDefectCode[RAW_CODE_MAX]; |
| | | /* <LJC 20220422 : #3957 ADD End> */ |
| | | |
| | | int m_nDefectNumJudgeOKWhite; |
| | | int m_nDefectNumJudgeOKBlack; |
| | |
| | | /* <KYH 211129 : #3796 ADD Start> */ |
| | | int m_nDefectNumJudgeND; |
| | | /* <KYH 211129 : #3796 ADD End> */ |
| | | /* <LJC 20220422 : #3957 ADD Start> */ |
| | | int m_nDefectCode[RAW_CODE_MAX]; |
| | | /* <LJC 20220422 : #3957 ADD End> */ |
| | | //DUMY DATA |
| | | int Dumy_int[9]; |
| | | |
| | |
| | | #define RAWMESSENGER_MAXCAMNUM 30 |
| | | #define RAWMESSENGER_MAXSCANNUM 20 |
| | | #define RAWMESSENGER_MAXHLINUM 8 |
| | | #define RAW_CODE_MAX 10 |
| | | |
| | | #define MAX_ZONE_NUM 16 |
| | | |
| | |
| | | int m_nDefectNumTypeMD; |
| | | int m_nDefectNumTypeCD; |
| | | int m_nDefectNumTypeMC; |
| | | /* <LJC 20220422 : #3957 ADD Start> */ |
| | | int m_nDefectCode[RAW_CODE_MAX]; |
| | | /* <LJC 20220422 : #3957 ADD End> */ |
| | | |
| | | int m_nDefectNumJudgeOKWhite; |
| | | int m_nDefectNumJudgeOKBlack; |
| | |
| | | /* <KYH 211129 : #3796 ADD Start> */ |
| | | int m_nDefectNumJudgeND; |
| | | /* <KYH 211129 : #3796 ADD End> */ |
| | | /* <LJC 20220422 : #3957 ADD Start> */ |
| | | int m_nDefectCode[RAW_CODE_MAX]; |
| | | /* <LJC 20220422 : #3957 ADD End> */ |
| | | //DUMY DATA |
| | | int Dumy_int[9]; |
| | | |
| | |
| | | #define RAWMESSENGER_MAXCAMNUM 30 |
| | | #define RAWMESSENGER_MAXSCANNUM 20 |
| | | #define RAWMESSENGER_MAXHLINUM 8 |
| | | #define RAW_CODE_MAX 10 |
| | | |
| | | #define MAX_ZONE_NUM 16 |
| | | |
| | |
| | | int m_nDefectNumTypeMD; |
| | | int m_nDefectNumTypeCD; |
| | | int m_nDefectNumTypeMC; |
| | | /* <LJC 20220422 : #3957 ADD Start> */ |
| | | int m_nDefectCode[RAW_CODE_MAX]; |
| | | /* <LJC 20220422 : #3957 ADD End> */ |
| | | |
| | | int m_nDefectNumJudgeOKWhite; |
| | | int m_nDefectNumJudgeOKBlack; |
| | |
| | | /* <KYH 211129 : #3796 ADD Start> */ |
| | | int m_nDefectNumJudgeND; |
| | | /* <KYH 211129 : #3796 ADD End> */ |
| | | /* <LJC 20220422 : #3957 ADD Start> */ |
| | | int m_nDefectCode[RAW_CODE_MAX]; |
| | | /* <LJC 20220422 : #3957 ADD End> */ |
| | | //DUMY DATA |
| | | int Dumy_int[9]; |
| | | |