SDC C-Project CF Review 프로그램
LYW
2022-05-31 f1a543772246f59b8b52a8857270b38ee38f3588
DitGlassRawMessenger/DitGlassRawMessenger/DitGlassRawMessengerDlg.cpp
@@ -1,5 +1,5 @@
// DitGlassRawMessengerDlg.cpp : ���� ����
// DitGlassRawMessengerDlg.cpp : 구현 파일
//
#include "stdafx.h"
@@ -23,20 +23,20 @@
#define GRID_TEXT_COLOR         RGB(255,255,255)
#define GRID_ALARM_TEXT_COLOR   RGB(255,0,0)
#define GRID_LINE_COLOR         GRID_FIX_COLOR
// ���� ���α׷� ������ ���Ǵ� CAboutDlg ��ȭ �����Դϴ�.
// 응용 프로그램 정보에 사용되는 CAboutDlg 대화 상자입니다.
class CAboutDlg : public CDialog
{
public:
   CAboutDlg();
// ��ȭ ���� �������Դϴ�.
// 대화 상자 데이터입니다.
   enum { IDD = IDD_ABOUTBOX };
   protected:
   virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV �����Դϴ�.
   virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 지원입니다.
// �����Դϴ�.
// 구현입니다.
protected:
   DECLARE_MESSAGE_MAP()
};
@@ -54,7 +54,7 @@
END_MESSAGE_MAP()
// CDitGlassRawMessengerDlg ��ȭ ����
// CDitGlassRawMessengerDlg 대화 상자
@@ -127,11 +127,10 @@
   m_vecStrGridDefectHeader.push_back("CellY(mm)");
   m_vecStrGridDefectHeader.push_back("ScrtRatio");
   m_vecStrGridDefectHeader.push_back("Density");
   //201207 CJH - Merge ���� Ȯ��
   //201207 CJH - Merge 여부 확인
   m_vecStrGridDefectHeader.push_back("MergeState");
}
void CDitGlassRawMessengerDlg::DoDataExchange(CDataExchange* pDX)
{
   CDialog::DoDataExchange(pDX);
@@ -166,6 +165,9 @@
   ON_BN_CLICKED(IDC_BTN_STACKAPPLY, &CDitGlassRawMessengerDlg::OnBnClickedBtnStackapply)
   ON_BN_CLICKED(IDC_TEST_CMD, &CDitGlassRawMessengerDlg::OnBnClickedTestCmd)
   ON_BN_CLICKED(IDC_BTN_FTP_MANUALUPLOAD, &CDitGlassRawMessengerDlg::OnBnClickedBtnFtpManualupload)
   /* <LJC 20211122 : #3820 ADD Start> */
   ON_WM_COPYDATA()
   /* <LJC 20211122 : #3820 ADD End> */
END_MESSAGE_MAP()
void GetCompileTime(tm& timestruct)
@@ -192,16 +194,22 @@
   if (timestruct.tm_mon>11 || timestruct.tm_mon<0 )
      ASSERT(FALSE);
}
// CDitGlassRawMessengerDlg �޽��� ó����
// CDitGlassRawMessengerDlg 메시지 처리기
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);
   // �ý��� �޴��� "����..." �޴� �׸��� �߰��մϴ�.
   // 시스템 메뉴에 "정보..." 메뉴 항목을 추가합니다.
   // IDM_ABOUTBOX�� �ý��� ��� ������ �־�� �մϴ�.
   // IDM_ABOUTBOX는 시스템 명령 범위에 있어야 합니다.
   ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
   ASSERT(IDM_ABOUTBOX < 0xF000);
@@ -219,16 +227,16 @@
      }
   }
   // �� ��ȭ ������ �������� �����մϴ�. ���� ���α׷��� �� â�� ��ȭ ���ڰ� �ƴ� ��쿡��
   //  �����ӿ�ũ�� �� �۾��� �ڵ����� �����մϴ�.
   SetIcon(m_hIcon, TRUE);         // ū �������� �����մϴ�.
   SetIcon(m_hIcon, FALSE);      // ���� �������� �����մϴ�.
   // 이 대화 상자의 아이콘을 설정합니다. 응용 프로그램의 주 창이 대화 상자가 아닐 경우에는
   //  프레임워크가 이 작업을 자동으로 수행합니다.
   SetIcon(m_hIcon, TRUE);         // 큰 아이콘을 설정합니다.
   SetIcon(m_hIcon, FALSE);      // 작은 아이콘을 설정합니다.
   //Ʈ���̾����� ����
   //트레이아이콘 구성
   m_TrayIcon = FALSE;
   ResTrayIcon();
   //��� ����
   //빌드 정보
   {
      CString strBuild;
      tm tmBuild;
@@ -237,7 +245,7 @@
      SetDlgItemText(IDC_BUILDDATE, strBuild);
   }
   //�������� ���� �о� ���� [������ 2018/11/20]
   //설정파일 정보 읽어 오기 [김태현 2018/11/20]
   {
      m_strConfigFile;
      {
@@ -251,9 +259,13 @@
      akFileDB.getItem("DataMaxNumCell", &m_ConfigOption.m_nMaxDataNumCell, 200);
      akFileDB.getItem("DataMaxNumDefect", &m_ConfigOption.m_nMaxDataNumDefect, 50000);
      akFileDB.getItem("SelectRawType", &m_ConfigOption.m_nSelectRawType, 0);
      akFileDB.getItem("LogFilePath", m_ConfigOption.m_strLogFilePath, "c:\\AOIServer\\LogRawMessenger\\LogRawMessenger");
      akFileDB.getItem("LogFilePath", m_ConfigOption.m_strLogFilePath, "D:\\AOIServer\\LogRawMessenger\\LogRawMessenger");
      akFileDB.getItem("Stack_Use", &m_ConfigOption.m_bUseStack, 0);
      akFileDB.getItem("Stack_LocalPath", m_ConfigOption.m_strStackLocalPath, "D:\\DIT_ResultData\\Stack");
      /*< KJG 20211024 - #3487 ADD Start >*/
      akFileDB.getItem("RawMerge_Use", &m_ConfigOption.m_bUseRawMerge, 0);
      akFileDB.getItem("RawMerge_LocalPath", m_ConfigOption.m_strRawMergeLocalPath, "D:\\DIT_ResultData\\RawMerge");
      /*< KJG 20211024 - #3487 ADD End >*/
      akFileDB.getItem("Stack_EquipID",m_ConfigOption.m_strStackEquipID, "AAAAA");
      akFileDB.getItem("Stack_Param1",m_ConfigOption.m_strStackParam1, "");
      akFileDB.getItem("Stack_Param2",m_ConfigOption.m_strStackParam2, "");
@@ -263,12 +275,14 @@
      ((CButton*)GetDlgItem(IDC_CHECK_STACKFILEREAD))->SetCheck(m_ConfigOption.m_bUseStack);
      SetDlgItemText(IDC_EDIT_STACK_LOCALSAVEPATH, m_ConfigOption.m_strStackLocalPath);
      ((CButton*)GetDlgItem(IDC_CHECK_RAWMERGEFILEREAD))->SetCheck(m_ConfigOption.m_bUseRawMerge);
      SetDlgItemText(IDC_EDIT_RAWMERGE_LOCALSAVEPATH, m_ConfigOption.m_strRawMergeLocalPath);
      SetDlgItemText(IDC_EDIT_STACK_EQUIPID, m_ConfigOption.m_strStackEquipID);
      SetDlgItemText(IDC_EDIT_STACK_PARAM1, m_ConfigOption.m_strStackParam1);
      SetDlgItemText(IDC_EDIT_STACK_PARAM2, m_ConfigOption.m_strStackParam2);
   }
   //�α� ���� [������ 2018/11/20]
   //로그 관련 [김태현 2018/11/20]
   {
      CakFileUtil fileutil;
      char strPath[256];
@@ -276,7 +290,7 @@
      CreateDirectory(strPath, NULL);
      //CakLoggerExt::getInstance()->setWriteFileMode(m_ConfigOption.m_strLogFilePath);
      CakLoggerExt::getInstance()->setWriteFileMode2("C:\\DIT_LogData\\", "logGlassRawMessenger");
      CakLoggerExt::getInstance()->setWriteFileMode2("D:\\DIT_LogData\\", "logGlassRawMessenger");
      CakLoggerExt::getInstance()->m_hParent = GetSafeHwnd();
      m_ctrlLoggerList;
@@ -371,30 +385,30 @@
   if(m_Server.CreateServer(m_ConfigOption.m_nMaxDataNumCell, m_ConfigOption.m_nMaxDataNumDefect) == FALSE)
   {
      AfxMessageBox("���� ���� ���� ���� �մϴ�.");
      AfxMessageBox("서버 생성 실패 종료 합니다.");
      exit(0);
   }
   //���簪 ���� [������ 2019/1/12]
   //현재값 적용 [김태현 2019/1/12]
   {
      CDitGlassRawServer* pServer = (CDitGlassRawServer*) &m_Server;
      CgrmGlassRawData* pRawDataBuffer = &m_GlassRawDataBuffer;
      pRawDataBuffer->ImportGlassRaw(pServer->GetGlassRawInfo(), (char*)pServer->GetGlassData());
   }
   
   //�۾� ������ ���� [������ 2018/11/13]
   //작업 쓰레드 생성 [김태현 2018/11/13]
   {
      _beginthread(threadMain, NULL, this);
   }
   
   PostMessage(UM_GLASSRAW_CLIENTMESSAGE);
   return TRUE;  // ��Ŀ���� ��Ʈ�ѿ� �������� ������ TRUE�� ��ȯ�մϴ�.
   return TRUE;  // 포커스를 컨트롤에 설정하지 않으면 TRUE를 반환합니다.
}
void CDitGlassRawMessengerDlg::OnBnClickedOk()
{
   // TODO: ���⿡ ��Ʈ�� �˸� ó���� �ڵ带 �߰��մϴ�.
   // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
   OnOK();
}
@@ -403,14 +417,14 @@
{
   NOTIFYICONDATA nid;
   nid.cbSize = sizeof(nid);
   nid.hWnd = m_hWnd; // ���� ������ �ڵ�
   nid.uID = IDR_MAINFRAME; // ������ ���ҽ� ID
   nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; // �÷��� ����
   nid.uCallbackMessage = UM_TRAYICON_MSG; // �ݹ�޽��� ����
   nid.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); // ������ �ε�
   nid.hWnd = m_hWnd; // 메인 윈도우 핸들
   nid.uID = IDR_MAINFRAME; // 아이콘 리소스 ID
   nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; // 플래그 설정
   nid.uCallbackMessage = UM_TRAYICON_MSG; // 콜백메시지 설정
   nid.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); // 아이콘 로드
   char strTitle[256];
   GetWindowText(strTitle, sizeof(strTitle)); // ĸ�ǹٿ� ��µ� ���ڿ� ����
   GetWindowText(strTitle, sizeof(strTitle)); // 캡션바에 출력된 문자열 얻음
   lstrcpy(nid.szTip, strTitle);
   Shell_NotifyIcon(NIM_ADD, &nid);
   SendMessage(WM_SETICON, (WPARAM)TRUE, (LPARAM)nid.hIcon);
@@ -433,8 +447,8 @@
      GetCursorPos(&pos);
      {
         HMENU hMenu = CreatePopupMenu();
         AppendMenu(hMenu, MF_STRING, 0, "������2��Ʈ��ǰ");
         AppendMenu(hMenu, MF_STRING, WM_DESTROY, "Exit");
         AppendMenu(hMenu, MF_STRING, 0, "연구소2파트작품");
         AppendMenu(hMenu, MF_STRING, WM_DESTROY, "Exit");
         TrackPopupMenu(hMenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, pos.x, pos.y, 0, GetSafeHwnd(), NULL);
      }
      
@@ -461,19 +475,19 @@
   }
}
// ��ȭ ���ڿ� �ּ�ȭ ���߸� �߰��� ��� �������� �׸�����
//  �Ʒ� �ڵ尡 �ʿ��մϴ�. ����/�� ���� ����ϴ� MFC ���� ���α׷��� ��쿡��
//  �����ӿ�ũ���� �� �۾��� �ڵ����� �����մϴ�.
// 대화 상자에 최소화 단추를 추가할 경우 아이콘을 그리려면
//  아래 코드가 필요합니다. 문서/뷰 모델을 사용하는 MFC 응용 프로그램의 경우에는
//  프레임워크에서 이 작업을 자동으로 수행합니다.
void CDitGlassRawMessengerDlg::OnPaint()
{
   if (IsIconic())
   {
      CPaintDC dc(this); // �׸��⸦ ���� ����̽� ���ؽ�Ʈ
      CPaintDC dc(this); // 그리기를 위한 디바이스 컨텍스트
      SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
      // Ŭ���̾�Ʈ �簢������ �������� ����� ����ϴ�.
      // 클라이언트 사각형에서 아이콘을 가운데에 맞춥니다.
      int cxIcon = GetSystemMetrics(SM_CXICON);
      int cyIcon = GetSystemMetrics(SM_CYICON);
      CRect rect;
@@ -481,7 +495,7 @@
      int x = (rect.Width() - cxIcon + 1) / 2;
      int y = (rect.Height() - cyIcon + 1) / 2;
      // �������� �׸��ϴ�.
      // 아이콘을 그립니다.
      dc.DrawIcon(x, y, m_hIcon);
   }
   else
@@ -490,8 +504,8 @@
   }
}
// ����ڰ� �ּ�ȭ�� â�� ��� ���ȿ� Ŀ���� ǥ�õǵ��� �ý��ۿ���
//  �� �Լ��� ȣ���մϴ�.
// 사용자가 최소화된 창을 끄는 동안에 커서가 표시되도록 시스템에서
//  이 함수를 호출합니다.
HCURSOR CDitGlassRawMessengerDlg::OnQueryDragIcon()
{
   return static_cast<HCURSOR>(m_hIcon);
@@ -501,15 +515,15 @@
void CDitGlassRawMessengerDlg::OnDropFiles(HDROP hDropInfo)
{
   int nFiles;
   char szPathName[MAX_PATH];  // ���� ��θ��� ����.
   char szPathName[MAX_PATH];  // 파일 경로면이 들어간다.
   CString strFileName;
   // ��ӵ� ������ ����
   // 드롭된 파일의 갯수
   nFiles = ::DragQueryFile( hDropInfo, 0xFFFFFFFF, szPathName, MAX_PATH );
   for(int i = nFiles-1 ; i >= 0; i--)  //��ӵ� ���� ������ŭ ������ ���鼭 ���� ��θ� �޼��� �ڽ��� ���
   for(int i = nFiles-1 ; i >= 0; i--)  //드롭된 파일 갯수만큼 루프를 돌면서 파일 경로를 메세지 박스로 출력
   {
      // ������ ��� ����
      // 파일의 경로 얻어옴
      ::DragQueryFile(hDropInfo, i, szPathName, MAX_PATH);
      SetDlgItemText(IDC_EDIT_RAWFILENAME, szPathName);
@@ -593,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()
@@ -601,18 +618,18 @@
   if(pRawInfo->m_nCommandIdxWrite != pRawInfo->m_nCommandIdxRead)
   {
      int nReadIdx = (pRawInfo->m_nCommandIdxRead+1)%COMMAND_MAXCOUNT; //����� ���� ������ ����Ʈ������ �ϳ� �������Ѽ� �д´�. [������ 2018/11/13]
      int nReadIdx = (pRawInfo->m_nCommandIdxRead+1)%COMMAND_MAXCOUNT; //현재는 읽은 마지막 포인트임으로 하나 증가시켜서 읽는다. [김태현 2018/11/13]
      _grmDitCommand::_grmCommand* pCommand = &pRawInfo->m_nCommandBuffer[nReadIdx];
      AKLOG("Recv Command ID:%d(r%d/w%d)", pCommand->nCommand, nReadIdx, pRawInfo->m_nCommandIdxWrite);
      pRawInfo->m_nCommandIdxRead = nReadIdx;
      if(pCommand->nResult == -1) //��� ���� �� [������ 2018/11/13]
      if(pCommand->nResult == -1) //명령 수행 전 [김태현 2018/11/13]
      {
         pCommand->nResult = ProcessCommand( (emGlassRawCommand)pCommand->nCommand, pCommand->strParam );
      }
      else
      {
         //�̹� ó�� �Ȱ� [������ 2018/11/13]
         //이미 처리 된거 [김태현 2018/11/13]
      }
      AKLOG("Recv Command ID:%d(r%d/w%d) Process End(Result:%d)", pCommand->nCommand, nReadIdx, pRawInfo->m_nCommandIdxWrite, pCommand->nResult);
@@ -658,7 +675,7 @@
      {
         nResult = m_pGlassRawMaker->SequenceInspectEnd(pRawDataBuffer);
         pServer->GetGlassRawInfo()->m_ServerProcStep = APS_InspectEnd;
         //Stack ������ �����޸𸮿� �ݿ� �ϱ� ���� Export
         //Stack 정보를 공유메모리에 반영 하기 위한 Export
         //pRawDataBuffer->ExportGlassRaw(pServer->GetGlassRawInfo(), (char*)pServer->GetGlassData());
         break;
      }
@@ -677,7 +694,7 @@
   case grcSequenceCustomReviewDataRead:
      {
         nResult = m_pGlassRawMaker->SequenceCustomizeReview(pRawDataBuffer);
         ////Customize Review�� ���� ������Ʈ
         ////Customize Review를 위한 업데이트
         //{
         //   memcpy(pServer->GetDefectData(0), pRawDataBuffer->GetDefectData(0), sizeof(_grmDefectData)*pServer->GetGlassRawInfo()->m_nDefectMaxDataNum);
         //   memcpy(pServer->GetCellData(0), pRawDataBuffer->GetCellData(0), sizeof(_grmCellData)*pServer->GetGlassRawInfo()->m_nCellMaxDataNum);
@@ -763,7 +780,6 @@
}
BOOL CDitGlassRawMessengerDlg::DestroyWindow()
{
   if(m_nThreadMainFlag != 0)
@@ -777,14 +793,14 @@
   
   if(m_pGlassRawMaker) delete m_pGlassRawMaker;
   
   if(m_TrayIcon) // ���� Ʈ���� ���������� �����Ǿ����� Ȯ��
   if(m_TrayIcon) // 현재 트레이 아이콘으로 설정되었는지 확인
   {
      NOTIFYICONDATA nid;
      nid.cbSize = sizeof(nid);
      nid.hWnd = m_hWnd; // ���� ������ �ڵ�
      nid.hWnd = m_hWnd; // 메인 윈도우 핸들
      nid.uID = IDR_MAINFRAME;
      // �۾� ǥ����(TaskBar)�� ���� ������ �������� �����Ѵ�.
      // 작업 표시줄(TaskBar)의 상태 영역에 아이콘을 삭제한다.
      Shell_NotifyIcon(NIM_DELETE, &nid);
   }
@@ -942,7 +958,7 @@
BOOL CDitGlassRawMessengerDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
   // TODO: ���⿡ Ư��ȭ�� �ڵ带 �߰� ��/�Ǵ� �⺻ Ŭ������ ȣ���մϴ�.
   // TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
   if (m_gridCellInfo.GetSafeHwnd() && wParam == (WPARAM)m_gridCellInfo.GetDlgCtrlID())
   {
      *pResult = 1;
@@ -1264,7 +1280,7 @@
               CString      str;
               strItem = _T("          ");
               // Panel x��, y���� �۶󽺿� �ݴ� [6/9/2017 bhs]
               // Panel x축, y축은 글라스와 반대 [6/9/2017 bhs]
               if(1)//g_pBasic->GetScanCoordination() == SC_XCoord)
                  str.Format("% 5.3f", (double)pDefect->m_nUMCellX / 1000.0);
               else
@@ -1287,7 +1303,7 @@
               CString      str;
               strItem = _T("          ");
               // Panel x��, y���� �۶󽺿� �ݴ� [6/9/2017 bhs]
               // Panel x축, y축은 글라스와 반대 [6/9/2017 bhs]
               if(1)//g_pBasic->GetScanCoordination() == SC_XCoord)
                  str.Format("% 5.3f", (double)pDefect->m_nUMCellY / 1000.0);
               else
@@ -1345,6 +1361,10 @@
   akFileDB.setItem("Stack_Use", m_ConfigOption.m_bUseStack);
   akFileDB.setItem("Stack_LocalPath", m_ConfigOption.m_strStackLocalPath);
   /*< KJG 20211024 - #3487 ADD Start >*/
   akFileDB.setItem("RawMerge_Use", m_ConfigOption.m_bUseRawMerge);
   akFileDB.setItem("RawMerge_LocalPath", m_ConfigOption.m_strRawMergeLocalPath);
   /*< KJG 20211024 - #3487 ADD End >*/
   akFileDB.setItem("Stack_EquipID", m_ConfigOption.m_strStackEquipID);
   akFileDB.setItem("Stack_Param1",m_ConfigOption.m_strStackParam1);
   akFileDB.setItem("Stack_Param2",m_ConfigOption.m_strStackParam2);
@@ -1439,7 +1459,7 @@
void CDitGlassRawMessengerDlg::OnBnClickedBtnImportRaw()
{
   AKLOG("�̱���� ������ �ʿ䰡 �ְڳ�.. ������...");
   AKLOG("이기능은 가급적 필요가 있겠나.. 싶으네...");
   PostMessage(UM_GLASSRAW_CLIENTMESSAGE);
}
@@ -1524,6 +1544,10 @@
{
   m_ConfigOption.m_bUseStack = ((CButton*)GetDlgItem(IDC_CHECK_STACKFILEREAD))->GetCheck();
   GetDlgItemText(IDC_EDIT_STACK_LOCALSAVEPATH,m_ConfigOption.m_strStackLocalPath, 256);
   /*< KJG 20211024 - #3487 ADD Start >*/
   m_ConfigOption.m_bUseRawMerge = ((CButton*)GetDlgItem(IDC_CHECK_RAWMERGEFILEREAD))->GetCheck();
   GetDlgItemText(IDC_EDIT_RAWMERGE_LOCALSAVEPATH, m_ConfigOption.m_strRawMergeLocalPath, 256);
   /*< KJG 20211024 - #3487 ADD End >*/
   GetDlgItemText(IDC_EDIT_STACK_EQUIPID,m_ConfigOption.m_strStackEquipID, 32);
   GetDlgItemText(IDC_EDIT_STACK_PARAM1,m_ConfigOption.m_strStackParam1, 32);
   GetDlgItemText(IDC_EDIT_STACK_PARAM2,m_ConfigOption.m_strStackParam2, 32);
@@ -1574,13 +1598,13 @@
   
   
      CString str = _T("All(*.*)|*.*|");   // ������ ���� ����
      CString str = _T("All(*.*)|*.*|");   // 선택할 파일 종류
      CString File;
      CString strFileList; 
      CFileDialog dlg(TRUE, NULL, NULL, OFN_ALLOWMULTISELECT, str, this);
      const int c_cMaxFiles = 400 /*������ ���� ����*/ ;   // �޸� ������������ Ȯ�� �����ָ� � ����
      const int c_cMaxFiles = 400 /*선택할 파일 숫자*/ ;   // 메모리 부족현상으로 확장 안해주면 몇개 못씀
      const int c_cbBuffSize = (c_cMaxFiles * (MAX_PATH + 1)) + 1;
      dlg.GetOFN().lpstrFile = strFileList.GetBuffer(c_cbBuffSize);
      dlg.GetOFN().nMaxFile = c_cbBuffSize;
@@ -1591,7 +1615,7 @@
      {
         for(POSITION pos=dlg.GetStartPosition(); pos != NULL;)
         {
            // ��ü������ ResetContent
            // 전체삭제는 ResetContent
            File = dlg.GetNextPathName(pos);
@@ -1605,3 +1629,51 @@
   
}
/* <LJC 20211122 : #3820 ADD Start> */
BOOL CDitGlassRawMessengerDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
{
   // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
   CDitGlassRawServer* pServer = (CDitGlassRawServer*)&m_Server;
   CgrmGlassRawData* pRawDataBuffer = &m_GlassRawDataBuffer;
   pRawDataBuffer->ImportGlassRaw(pServer->GetGlassRawInfo(), (char*)pServer->GetGlassData(), true);
   CFTPCopyDataParam* FTPCopyDataParam = ((CFTPCopyDataParam*)pCopyDataStruct->lpData);
   switch (pCopyDataStruct->dwData)
   {
   case COPYDATA_RAW_DOWNLOAD_ACK:
      {
      if (FTPCopyDataParam->m_nProcessType == CFTPCopyDataParam::FTPProcessType_DownFile && pServer->GetGlassRawInfo()->m_ServerProcStep == APS_GlassLoading && m_pGlassRawMaker->GetEnableFtpAck() == TRUE)
      {
         if (FTPCopyDataParam->m_nSendResultCode == TRUE)
         {
            m_pGlassRawMaker->SetEnableFtpAck(FALSE);
            m_pGlassRawMaker->SearchFIle(pRawDataBuffer);
            break;
         }
         else
         {
            m_nMaxMergeList++;
            m_pGlassRawMaker->DownLoadMergeFile(pRawDataBuffer);
            if (m_nMaxMergeList > 10)
            {
               m_nMaxMergeList = 0;
               break;
            }
         }
      }
      else
      {
         break;
      }
      }
      break;
   default:
      break;
   }
   return CDialog::OnCopyData(pWnd, pCopyDataStruct);
}
/* <LJC 20211122 : #3820 ADD End> */