SDC C-Project CF Review 프로그램
LYW
2022-05-31 f1a543772246f59b8b52a8857270b38ee38f3588
AOI RawMessenger 동기화
2개 파일 추가됨
12개 파일 변경됨
1151 ■■■■■ 파일 변경됨
DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessenger.cpp 9 ●●●● 패치 | 보기 | raw | blame | 히스토리
DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessenger.vcxproj 4 ●●●● 패치 | 보기 | raw | blame | 히스토리
DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessenger.vcxproj.filters 6 ●●●●● 패치 | 보기 | raw | blame | 히스토리
DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessengerDlg.cpp 13 ●●●● 패치 | 보기 | raw | blame | 히스토리
DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.cpp 190 ●●●● 패치 | 보기 | raw | blame | 히스토리
DitGlassRawMessenger/DitGlassRawMessenger/GlassRawDemo.cpp 1 ●●●● 패치 | 보기 | raw | blame | 히스토리
DitGlassRawMessenger/DitGlassRawMessenger/RawResultReader.cpp 168 ●●●●● 패치 | 보기 | raw | blame | 히스토리
DitGlassRawMessenger/DitGlassRawMessenger/RawResultReader.h 4 ●●● 패치 | 보기 | raw | blame | 히스토리
DitGlassRawMessenger/DitGlassRawMessenger/SelfDump.cpp 614 ●●●●● 패치 | 보기 | raw | blame | 히스토리
DitGlassRawMessenger/DitGlassRawMessenger/SelfDump.h 121 ●●●●● 패치 | 보기 | raw | blame | 히스토리
DitGlassRawMessenger/Extern/DitGlassRawStruct.h 7 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewHistory/ReveiwHistory/DitGlassRawStruct.h 7 ●●●●● 패치 | 보기 | raw | blame | 히스토리
ReviewHistory/bin/ReviewHistroy.exe 패치 | 보기 | raw | blame | 히스토리
ReviewSystem/ReviewSystem/DitGlassRawStruct.h 7 ●●●●● 패치 | 보기 | raw | blame | 히스토리
DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessenger.cpp
@@ -5,7 +5,7 @@
#include "stdafx.h"
#include "DitGlassRawMessenger.h"
#include "DitGlassRawMessengerDlg.h"
#include "SelfDump.h"    /* < KMH 20220406 : #4053 ADD  > */
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
@@ -71,6 +71,13 @@
    // ì ì ˆí•œ ë‚´ìš©ìœ¼ë¡œ ìˆ˜ì •해야 í•©ë‹ˆë‹¤.
    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();
DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessenger.vcxproj
@@ -150,6 +150,7 @@
      <GenerateDebugInformation>true</GenerateDebugInformation>
      <SubSystem>Windows</SubSystem>
      <TargetMachine>MachineX64</TargetMachine>
      <UACExecutionLevel>RequireAdministrator</UACExecutionLevel>
    </Link>
  </ItemDefinitionGroup>
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@@ -215,6 +216,7 @@
      <OptimizeReferences>true</OptimizeReferences>
      <EnableCOMDATFolding>true</EnableCOMDATFolding>
      <TargetMachine>MachineX64</TargetMachine>
      <UACExecutionLevel>RequireAdministrator</UACExecutionLevel>
    </Link>
  </ItemDefinitionGroup>
  <ItemGroup>
@@ -235,6 +237,7 @@
    <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">
@@ -264,6 +267,7 @@
    <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" />
DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessenger.vcxproj.filters
@@ -96,6 +96,9 @@
    <ClCompile Include="RawResultReader.cpp">
      <Filter>RawInterface\Stack</Filter>
    </ClCompile>
    <ClCompile Include="SelfDump.cpp">
      <Filter>소스 íŒŒì¼</Filter>
    </ClCompile>
  </ItemGroup>
  <ItemGroup>
    <ClInclude Include="akLoggerExt.h">
@@ -167,6 +170,9 @@
    <ClInclude Include="RawResultReader.h">
      <Filter>RawInterface\Stack</Filter>
    </ClInclude>
    <ClInclude Include="SelfDump.h">
      <Filter>헤더 íŒŒì¼</Filter>
    </ClInclude>
  </ItemGroup>
  <ItemGroup>
    <None Include="res\DitGlassRawMessenger.ico">
DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessengerDlg.cpp
@@ -131,7 +131,6 @@
    m_vecStrGridDefectHeader.push_back("MergeState");
}
void CDitGlassRawMessengerDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
@@ -199,6 +198,12 @@
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);
@@ -443,7 +448,7 @@
        {
            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);
        }
        
@@ -602,6 +607,9 @@
        Sleep(10);
    }
    pThis->m_nThreadMainFlag = 0;
    /* <KMH 20220407 : #4053 ADD Start> */
    AKLOG("Main Thread End");
    /* <KMH 20220407 : #4053 ADD End> */
}
void CDitGlassRawMessengerDlg::MainProcess()
@@ -771,7 +779,6 @@
    WriteConfigFile();
}
BOOL CDitGlassRawMessengerDlg::DestroyWindow()
{
DitGlassRawMessenger/DitGlassRawMessenger/GlassRawCPJT.cpp
@@ -21,10 +21,6 @@
#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"
@@ -39,7 +35,9 @@
    /* <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)
@@ -67,6 +65,20 @@
    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);
@@ -80,6 +92,8 @@
BOOL CGlassRawCPJT::SequenceGlassLoading( CgrmGlassRawData* pData )
{
    AKLOG("Sequence :  Glass Loading Signal Start ");/* <KMH 20220407 : #4053 ADD > */
     SetEnableFtpAck(FALSE);
     m_nRawMergeIdx = 0;
    if(m_StackResult.getStackUse())
@@ -94,14 +108,24 @@
        {
            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());
@@ -117,20 +141,38 @@
        {
            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();
@@ -220,9 +262,15 @@
            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;
}
@@ -351,6 +399,7 @@
BOOL CGlassRawCPJT::SequenceFtpUpload(char* pRawFilePathName)
{
    AKLOG(" Sequence : FTP Upload Signal Start ");
    // Manual Upload ê¸°ëŠ¥ [21-02-05 KJG]
    CTime tmFileCreate;
    _grmGlassData GlassData;
@@ -423,7 +472,7 @@
    
    fclose(pf);
    AKLOG(" Sequence : FTP Upload Signal End ");
    return TRUE;
}
@@ -538,10 +587,14 @@
    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;
@@ -930,7 +983,19 @@
    {
        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]
}
@@ -1056,7 +1121,19 @@
    // 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]
}
@@ -1584,10 +1661,10 @@
    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 )
@@ -1626,9 +1703,19 @@
    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 )
@@ -1666,9 +1753,19 @@
    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 >*/
}
@@ -1708,9 +1805,19 @@
    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 >*/
}
  
@@ -1764,9 +1871,20 @@
    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;
}
DitGlassRawMessenger/DitGlassRawMessenger/GlassRawDemo.cpp
@@ -16,7 +16,6 @@
#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"
DitGlassRawMessenger/DitGlassRawMessenger/RawResultReader.cpp
@@ -59,11 +59,15 @@
    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();
@@ -368,7 +372,9 @@
    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);
    }
@@ -395,7 +401,8 @@
            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) //명령 ìˆ˜í–‰ì„ ë¹ ë¥´ê²Œ ê°ì§€ ìœ„한 ì¡°ì¹˜
@@ -411,15 +418,19 @@
                }
                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)
            {
@@ -433,57 +444,90 @@
    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);
@@ -495,27 +539,43 @@
        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;
}
DitGlassRawMessenger/DitGlassRawMessenger/RawResultReader.h
@@ -46,7 +46,9 @@
    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;
DitGlassRawMessenger/DitGlassRawMessenger/SelfDump.cpp
»õ ÆÄÀÏ
@@ -0,0 +1,614 @@
#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;
}
DitGlassRawMessenger/DitGlassRawMessenger/SelfDump.h
»õ ÆÄÀÏ
@@ -0,0 +1,121 @@
#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);
};
DitGlassRawMessenger/Extern/DitGlassRawStruct.h
@@ -9,6 +9,7 @@
#define RAWMESSENGER_MAXCAMNUM 30
#define RAWMESSENGER_MAXSCANNUM 20
#define RAWMESSENGER_MAXHLINUM 8
#define RAW_CODE_MAX 10
#define MAX_ZONE_NUM 16
@@ -116,6 +117,9 @@
    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;
@@ -274,6 +278,9 @@
    /* <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];
ReviewHistory/ReveiwHistory/DitGlassRawStruct.h
@@ -9,6 +9,7 @@
#define RAWMESSENGER_MAXCAMNUM 30
#define RAWMESSENGER_MAXSCANNUM 20
#define RAWMESSENGER_MAXHLINUM 8
#define RAW_CODE_MAX 10
#define MAX_ZONE_NUM 16
@@ -116,6 +117,9 @@
    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;
@@ -274,6 +278,9 @@
    /* <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];
ReviewHistory/bin/ReviewHistroy.exe
Binary files differ
ReviewSystem/ReviewSystem/DitGlassRawStruct.h
@@ -9,6 +9,7 @@
#define RAWMESSENGER_MAXCAMNUM 30
#define RAWMESSENGER_MAXSCANNUM 20
#define RAWMESSENGER_MAXHLINUM 8
#define RAW_CODE_MAX 10
#define MAX_ZONE_NUM 16
@@ -116,6 +117,9 @@
    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;
@@ -274,6 +278,9 @@
    /* <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];