LosaDev source snapshot 2019
This commit is contained in:
commit
c198676e97
20588 files changed
+8812878
No files matched your search
@@ -0,0 +1,20 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 11.00
|
||||
# Visual Studio 2010
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "OneClickCRC", "OneClickCRC\OneClickCRC.vcxproj", "{EA6A89CB-822A-4C7D-8118-74600D324E96}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Win32 = Debug|Win32
|
||||
Release|Win32 = Release|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{EA6A89CB-822A-4C7D-8118-74600D324E96}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{EA6A89CB-822A-4C7D-8118-74600D324E96}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{EA6A89CB-822A-4C7D-8118-74600D324E96}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{EA6A89CB-822A-4C7D-8118-74600D324E96}.Release|Win32.Build.0 = Release|Win32
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
@@ -0,0 +1,54 @@
|
||||
|
||||
// ChildView.cpp : CChildView 클래스의 구현
|
||||
//
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "OneClickCRC.h"
|
||||
#include "ChildView.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#endif
|
||||
|
||||
|
||||
// CChildView
|
||||
|
||||
CChildView::CChildView()
|
||||
{
|
||||
}
|
||||
|
||||
CChildView::~CChildView()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
BEGIN_MESSAGE_MAP(CChildView, CWnd)
|
||||
ON_WM_PAINT()
|
||||
END_MESSAGE_MAP()
|
||||
|
||||
|
||||
|
||||
// CChildView 메시지 처리기
|
||||
|
||||
BOOL CChildView::PreCreateWindow(CREATESTRUCT& cs)
|
||||
{
|
||||
if (!CWnd::PreCreateWindow(cs))
|
||||
return FALSE;
|
||||
|
||||
cs.dwExStyle |= WS_EX_CLIENTEDGE;
|
||||
cs.style &= ~WS_BORDER;
|
||||
cs.lpszClass = AfxRegisterWndClass(CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS,
|
||||
::LoadCursor(NULL, IDC_ARROW), reinterpret_cast<HBRUSH>(COLOR_WINDOW+1), NULL);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void CChildView::OnPaint()
|
||||
{
|
||||
CPaintDC dc(this); // 그리기를 위한 디바이스 컨텍스트입니다.
|
||||
|
||||
// TODO: 여기에 메시지 처리기 코드를 추가합니다.
|
||||
|
||||
// 그리기 메시지에 대해서는 CWnd::OnPaint()를 호출하지 마십시오.
|
||||
}
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
|
||||
// ChildView.h : CChildView 클래스의 인터페이스
|
||||
//
|
||||
|
||||
|
||||
#pragma once
|
||||
|
||||
|
||||
// CChildView 창
|
||||
|
||||
class CChildView : public CWnd
|
||||
{
|
||||
// 생성입니다.
|
||||
public:
|
||||
CChildView();
|
||||
|
||||
// 특성입니다.
|
||||
public:
|
||||
|
||||
// 작업입니다.
|
||||
public:
|
||||
|
||||
// 재정의입니다.
|
||||
protected:
|
||||
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
|
||||
|
||||
// 구현입니다.
|
||||
public:
|
||||
virtual ~CChildView();
|
||||
|
||||
// 생성된 메시지 맵 함수
|
||||
protected:
|
||||
afx_msg void OnPaint();
|
||||
DECLARE_MESSAGE_MAP()
|
||||
};
|
||||
|
||||
@@ -0,0 +1,175 @@
|
||||
|
||||
// MainFrm.cpp : CMainFrame 클래스의 구현
|
||||
//
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "OneClickCRC.h"
|
||||
|
||||
#include "MainFrm.h"
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#endif
|
||||
|
||||
// CMainFrame
|
||||
|
||||
IMPLEMENT_DYNAMIC(CMainFrame, CFrameWndEx)
|
||||
|
||||
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx)
|
||||
ON_WM_CREATE()
|
||||
ON_WM_SETFOCUS()
|
||||
ON_COMMAND(ID_VIEW_CUSTOMIZE, &CMainFrame::OnViewCustomize)
|
||||
ON_REGISTERED_MESSAGE(AFX_WM_CREATETOOLBAR, &CMainFrame::OnToolbarCreateNew)
|
||||
END_MESSAGE_MAP()
|
||||
|
||||
// CMainFrame 생성/소멸
|
||||
|
||||
CMainFrame::CMainFrame()
|
||||
{
|
||||
// TODO: 여기에 멤버 초기화 코드를 추가합니다.
|
||||
}
|
||||
|
||||
CMainFrame::~CMainFrame()
|
||||
{
|
||||
}
|
||||
|
||||
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
|
||||
{
|
||||
if (CFrameWndEx::OnCreate(lpCreateStruct) == -1)
|
||||
return -1;
|
||||
|
||||
BOOL bNameValid;
|
||||
|
||||
// 모든 사용자 인터페이스 요소를 그리는 데 사용하는 비주얼 관리자를 설정합니다.
|
||||
CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerVS2008));
|
||||
|
||||
if (!m_wndMenuBar.Create(this))
|
||||
{
|
||||
TRACE0("메뉴 모음을 만들지 못했습니다.\n");
|
||||
return -1; // 만들지 못했습니다.
|
||||
}
|
||||
|
||||
m_wndMenuBar.SetPaneStyle(m_wndMenuBar.GetPaneStyle() | CBRS_SIZE_DYNAMIC | CBRS_TOOLTIPS | CBRS_FLYBY);
|
||||
|
||||
// 메뉴 모음을 활성화해도 포커스가 이동하지 않게 합니다.
|
||||
CMFCPopupMenu::SetForceMenuFocus(FALSE);
|
||||
|
||||
// 프레임의 클라이언트 영역을 차지하는 뷰를 만듭니다.
|
||||
if (!m_wndView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW, CRect(0, 0, 0, 0), this, AFX_IDW_PANE_FIRST, NULL))
|
||||
{
|
||||
TRACE0("뷰 창을 만들지 못했습니다.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
|
||||
!m_wndToolBar.LoadToolBar(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME))
|
||||
{
|
||||
TRACE0("도구 모음을 만들지 못했습니다.\n");
|
||||
return -1; // 만들지 못했습니다.
|
||||
}
|
||||
|
||||
CString strToolBarName;
|
||||
bNameValid = strToolBarName.LoadString(IDS_TOOLBAR_STANDARD);
|
||||
ASSERT(bNameValid);
|
||||
m_wndToolBar.SetWindowText(strToolBarName);
|
||||
|
||||
CString strCustomize;
|
||||
bNameValid = strCustomize.LoadString(IDS_TOOLBAR_CUSTOMIZE);
|
||||
ASSERT(bNameValid);
|
||||
m_wndToolBar.EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize);
|
||||
|
||||
// TODO: 도구 모음 및 메뉴 모음을 도킹할 수 없게 하려면 이 다섯 줄을 삭제하십시오.
|
||||
m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);
|
||||
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
|
||||
EnableDocking(CBRS_ALIGN_ANY);
|
||||
DockPane(&m_wndMenuBar);
|
||||
DockPane(&m_wndToolBar);
|
||||
|
||||
|
||||
// Visual Studio 2005 스타일 도킹 창 동작을 활성화합니다.
|
||||
CDockingManager::SetDockingMode(DT_SMART);
|
||||
// Visual Studio 2005 스타일 도킹 창 자동 숨김 동작을 활성화합니다.
|
||||
EnableAutoHidePanes(CBRS_ALIGN_ANY);
|
||||
|
||||
// 도구 모음 및 도킹 창 메뉴 바꾸기를 활성화합니다.
|
||||
EnablePaneMenu(TRUE, ID_VIEW_CUSTOMIZE, strCustomize, ID_VIEW_TOOLBAR);
|
||||
|
||||
// 빠른(<Alt> 키를 누른 채 끌기) 도구 모음 사용자 지정을 활성화합니다.
|
||||
CMFCToolBar::EnableQuickCustomization();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
|
||||
{
|
||||
if( !CFrameWndEx::PreCreateWindow(cs) )
|
||||
return FALSE;
|
||||
// TODO: CREATESTRUCT cs를 수정하여 여기에서
|
||||
// Window 클래스 또는 스타일을 수정합니다.
|
||||
|
||||
cs.style = WS_OVERLAPPED | WS_CAPTION | FWS_ADDTOTITLE
|
||||
| WS_MINIMIZEBOX | WS_SYSMENU;
|
||||
|
||||
cs.dwExStyle &= ~WS_EX_CLIENTEDGE;
|
||||
cs.lpszClass = AfxRegisterWndClass(0);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// CMainFrame 진단
|
||||
|
||||
#ifdef _DEBUG
|
||||
void CMainFrame::AssertValid() const
|
||||
{
|
||||
CFrameWndEx::AssertValid();
|
||||
}
|
||||
|
||||
void CMainFrame::Dump(CDumpContext& dc) const
|
||||
{
|
||||
CFrameWndEx::Dump(dc);
|
||||
}
|
||||
#endif //_DEBUG
|
||||
|
||||
|
||||
// CMainFrame 메시지 처리기
|
||||
|
||||
void CMainFrame::OnSetFocus(CWnd* /*pOldWnd*/)
|
||||
{
|
||||
// 뷰 창으로 포커스를 이동합니다.
|
||||
m_wndView.SetFocus();
|
||||
}
|
||||
|
||||
BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
|
||||
{
|
||||
// 뷰에서 첫째 크랙이 해당 명령에 나타나도록 합니다.
|
||||
if (m_wndView.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
|
||||
return TRUE;
|
||||
|
||||
// 그렇지 않으면 기본 처리합니다.
|
||||
return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
|
||||
}
|
||||
|
||||
void CMainFrame::OnViewCustomize()
|
||||
{
|
||||
CMFCToolBarsCustomizeDialog* pDlgCust = new CMFCToolBarsCustomizeDialog(this, TRUE /* 메뉴를 검색합니다. */);
|
||||
pDlgCust->Create();
|
||||
}
|
||||
|
||||
LRESULT CMainFrame::OnToolbarCreateNew(WPARAM wp,LPARAM lp)
|
||||
{
|
||||
LRESULT lres = CFrameWndEx::OnToolbarCreateNew(wp,lp);
|
||||
if (lres == 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
CMFCToolBar* pUserToolbar = (CMFCToolBar*)lres;
|
||||
ASSERT_VALID(pUserToolbar);
|
||||
|
||||
BOOL bNameValid;
|
||||
CString strCustomize;
|
||||
bNameValid = strCustomize.LoadString(IDS_TOOLBAR_CUSTOMIZE);
|
||||
ASSERT(bNameValid);
|
||||
|
||||
pUserToolbar->EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize);
|
||||
return lres;
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
|
||||
// MainFrm.h : CMainFrame 클래스의 인터페이스
|
||||
//
|
||||
|
||||
#pragma once
|
||||
#include "ChildView.h"
|
||||
|
||||
class CMainFrame : public CFrameWndEx
|
||||
{
|
||||
|
||||
public:
|
||||
CMainFrame();
|
||||
protected:
|
||||
DECLARE_DYNAMIC(CMainFrame)
|
||||
|
||||
// 특성입니다.
|
||||
public:
|
||||
|
||||
// 작업입니다.
|
||||
public:
|
||||
|
||||
// 재정의입니다.
|
||||
public:
|
||||
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
|
||||
virtual BOOL OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo);
|
||||
|
||||
// 구현입니다.
|
||||
public:
|
||||
virtual ~CMainFrame();
|
||||
#ifdef _DEBUG
|
||||
virtual void AssertValid() const;
|
||||
virtual void Dump(CDumpContext& dc) const;
|
||||
#endif
|
||||
|
||||
protected: // 컨트롤 모음이 포함된 멤버입니다.
|
||||
CMFCMenuBar m_wndMenuBar;
|
||||
CMFCToolBar m_wndToolBar;
|
||||
CChildView m_wndView;
|
||||
|
||||
// 생성된 메시지 맵 함수
|
||||
protected:
|
||||
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
|
||||
afx_msg void OnSetFocus(CWnd *pOldWnd);
|
||||
afx_msg void OnViewCustomize();
|
||||
afx_msg LRESULT OnToolbarCreateNew(WPARAM wp, LPARAM lp);
|
||||
DECLARE_MESSAGE_MAP()
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -0,0 +1,964 @@
|
||||
#include "StdAfx.h"
|
||||
#include "CRCManager.h"
|
||||
|
||||
#include "../../OneCRCDlg.h"
|
||||
#include "../FTP/FTPManager.h"
|
||||
#include <urlmon.h>
|
||||
|
||||
CCRCManager *CCRCManager::g_Inst = NULL;
|
||||
|
||||
CCRCManager::CCRCManager(void) :
|
||||
m_iProcessStep(_FILECHECK), m_strInfoIniPath(_T("")), m_strAutoExeFolderAddr(_T(""))
|
||||
, m_strCrcReaderAddr(_T("")), m_strCopyFolderAddr(_T("")), m_strExportTxtAddr(_T("")),
|
||||
m_iServerCnt(SERVER_ONE), m_iConnectCnt(0)//, m_strChangeDataName(_T(""))
|
||||
, m_strIP(_T("")), m_strID(_T("")), m_strPW(_T("")), m_strLog(_T(""))
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
CCRCManager::~CCRCManager(void)
|
||||
{
|
||||
}
|
||||
|
||||
CCRCManager* CCRCManager::GetInst()
|
||||
{
|
||||
if(NULL == g_Inst)
|
||||
g_Inst = new CCRCManager;
|
||||
return g_Inst;
|
||||
}
|
||||
|
||||
void CCRCManager::ReleaseInst()
|
||||
{
|
||||
if(g_Inst)
|
||||
delete g_Inst;
|
||||
g_Inst = NULL;
|
||||
}
|
||||
|
||||
void CCRCManager::RunProcess()
|
||||
{
|
||||
|
||||
//CString strToken, strMakeDirName;
|
||||
|
||||
|
||||
switch(m_iProcessStep)
|
||||
{
|
||||
case _FILECHECK:
|
||||
PrintLog("서버 정보를 읽습니다.(info.ini)");
|
||||
CheckServerInfo(); //서버 갯수 확인
|
||||
LoadInfoINI();
|
||||
break;
|
||||
case _COPYnRUN:
|
||||
//필요한 파일을 원하는 경로에 복사 원본 파일, 파일명, 복사경로
|
||||
PrintLog("CrcReader.exe을 실행합니다");
|
||||
CopyFilePath(&m_strAutoExeFolderAddr, AUTO_UP_EXE);
|
||||
CopyFilePath(&m_strCrcReaderAddr, CRC_EXE_FILE_NAME);
|
||||
RunCRCnDelete(); //Reader 실행 및 불필요 파일 삭제
|
||||
case _MAKEFILE:
|
||||
PrintLog("Crc값을 통해 파일을 생성합니다.");
|
||||
CreateExportFolder();
|
||||
(*m_CRCDlg).SetConnectInfo(&m_strIP, &m_strID, &m_strPW); //접속 정보 전달
|
||||
(*m_CRCDlg).SetUploadListPath(&m_vecUploadlist); //업로드 리스트 보내주고
|
||||
(*m_CRCDlg).SetDownloadPath(&m_strExportTxtAddr); //다운로드 경로 전달
|
||||
CFTPManager::GetInst()->DownDataChangeFolder(&m_vecOutFolderName[SD_ALPHA]); //ftp다운로드 전달
|
||||
break;
|
||||
}
|
||||
++m_iProcessStep;
|
||||
if(m_iProcessStep >= _WORKCOMPLETE-1)
|
||||
{
|
||||
PrintLog("Crc값 생성 완료");
|
||||
return;
|
||||
}
|
||||
RunProcess();
|
||||
}
|
||||
|
||||
//경로안에 파일이 있는지 확인하는 함수입니다.
|
||||
BOOL CCRCManager::CheckFileInFolder(CString* const strPath, char* ctext )
|
||||
{
|
||||
CFileFind pFind;
|
||||
CString strSearchPath;
|
||||
strSearchPath = *strPath;
|
||||
strSearchPath += '\\';
|
||||
strSearchPath += ctext;
|
||||
return pFind.FindFile(strSearchPath);
|
||||
}
|
||||
|
||||
//메시지 박스 출력
|
||||
void CCRCManager::PrintMessage( int iType, char* ctext )
|
||||
{
|
||||
TCHAR szText[MAX_PATH] = {0};
|
||||
ChangeFontString(szText, ctext);
|
||||
|
||||
switch(iType)
|
||||
{
|
||||
case MC_FILE :
|
||||
MessageBoxW(g_hWnd, szText, L"NOT FOUND FILE", MB_OK);
|
||||
break;
|
||||
case MC_URL :
|
||||
MessageBoxW(g_hWnd, szText, L"NOT VALID URL", MB_OK);
|
||||
break;
|
||||
case MC_INTERNET :
|
||||
MessageBoxW(g_hWnd, szText, L"NOT CONNECTED INTERNET", MB_OK);
|
||||
break;
|
||||
case MC_ALERT :
|
||||
MessageBoxW(g_hWnd, szText, L"PROCESS ALERT", MB_OK);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//폰트 타입 변경
|
||||
void CCRCManager::ChangeFontString( TCHAR* pSour, char* pDest )
|
||||
{
|
||||
#if defined(UNICODE) | defined(_UNICODE)
|
||||
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED,
|
||||
pDest, strlen(pDest), pSour, strlen(pDest));
|
||||
#else
|
||||
strcpy(pSour, pDest);
|
||||
#endif
|
||||
}
|
||||
|
||||
//itype 값에 의해 info.ini에서 정보를 읽어 옵니다.
|
||||
void CCRCManager::GetINIData( CString* const FilePath, char* SourFile, int iType, CString* DestData)
|
||||
{
|
||||
CString strFilePath;
|
||||
strFilePath = *FilePath;
|
||||
strFilePath += '\\';
|
||||
strFilePath += SourFile;
|
||||
|
||||
char szName[MAX_PATH]={0,};
|
||||
GetCurrentDirectory(MAX_PATH,(LPWSTR)szName); //현재 경로 얻기
|
||||
CString strTestPath;
|
||||
AddStringToChar(&strTestPath, szName);
|
||||
|
||||
CString tchar;
|
||||
CString strToken, strAddr;
|
||||
switch (iType)
|
||||
{
|
||||
case GD_SERVERCNT:
|
||||
tchar = "ServerCount";
|
||||
break;
|
||||
case GD_INIPATH: //INI 읽어내
|
||||
tchar = "start.ini";
|
||||
break;
|
||||
case GD_CRCPATH :
|
||||
tchar = "CrcReader.exe";
|
||||
break;
|
||||
case GD_AUTOEXEPATH:
|
||||
tchar = "autoupgrade.exe";
|
||||
break;
|
||||
case GD_CPYFOLDER:
|
||||
tchar = "CopyFolder"; //복사폴더 설정시 info.ini에 넣어주셈
|
||||
break;
|
||||
case GD_IP:
|
||||
tchar = "IP";
|
||||
break;
|
||||
case GD_ID:
|
||||
tchar = "USER";
|
||||
break;
|
||||
case GD_PW:
|
||||
tchar = "Password";
|
||||
break;
|
||||
case GD_OTHERSVRCNT:
|
||||
tchar = "OtherSerCnt";
|
||||
break;
|
||||
case GD_BETACNT:
|
||||
tchar = "BETASVRCNT";
|
||||
break;
|
||||
case GD_LIVECNT:
|
||||
tchar = "LIVESVRCNT";
|
||||
break;
|
||||
}
|
||||
|
||||
CStdioFile Txt_File;
|
||||
if(Txt_File.Open(strFilePath, CFile::modeRead | CFile::typeText))
|
||||
{
|
||||
CString str, strToken;
|
||||
while(Txt_File.ReadString(str))
|
||||
{
|
||||
if(str.Find((LPWSTR)(LPCWSTR)tchar)!= -1)
|
||||
{
|
||||
if(iType == GD_AUTOEXEPATH && str.Find(L"ChangeData")!= -1)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
str += '='; //종료 문자열을 맨 뒤에 넣는다.
|
||||
AfxExtractSubString(strToken, str, 0, '=');
|
||||
AfxExtractSubString(strToken, str, 1, '=');
|
||||
strToken.TrimLeft(); //왼쪽 공백 제거
|
||||
*DestData += strToken;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
Txt_File.Close();
|
||||
}
|
||||
|
||||
//info.ini에서 기타 서버의 url 갯수만큼 정보를 읽어들입니다.
|
||||
void CCRCManager::GetINIData(std::vector<CString>* vecAddr, char* SourFile, int iType, std::vector<CString>* DestData, int ServerCnt)
|
||||
{
|
||||
CString cText, tStr;
|
||||
if(iType == GD_URL)
|
||||
cText = L"URL";
|
||||
|
||||
Iter iter;
|
||||
iter = vecAddr->begin();
|
||||
CStdioFile Txt_File;
|
||||
for(int i = 0; i < m_iServerCnt; ++i)
|
||||
{
|
||||
if(Txt_File.Open((LPCTSTR)(LPCTSTR)(*iter), CFile::modeRead | CFile::typeText))
|
||||
{
|
||||
CString str, strToken;
|
||||
while(Txt_File.ReadString(str))
|
||||
{
|
||||
if(str.Find((LPWSTR)(LPCWSTR)cText)!= -1)
|
||||
{
|
||||
str += '='; //종료 문자열을 맨 뒤에 넣는다.
|
||||
AfxExtractSubString(strToken, str, 0, '=');
|
||||
AfxExtractSubString(strToken, str, 1, '=');
|
||||
strToken.TrimLeft(); //왼쪽 공백 제거
|
||||
DestData->push_back(strToken);
|
||||
++iter;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
Txt_File.Close();
|
||||
}
|
||||
}
|
||||
|
||||
//info.ini에서 정보를 읽어들입니다.
|
||||
void CCRCManager::GetINIData(CString* const FilePath, char* SourFile, int iType, std::vector<CString>* DestData, int ServerCnt)
|
||||
{
|
||||
CString strFilePath;
|
||||
strFilePath = *FilePath;
|
||||
strFilePath += '\\';
|
||||
strFilePath += SourFile;
|
||||
CString tchar;
|
||||
|
||||
switch (iType)
|
||||
{
|
||||
case GD_URL: //url 읽어내
|
||||
tchar = "URL";
|
||||
break;
|
||||
case GD_INIPATH: //INI 읽어내
|
||||
tchar = "start.ini";
|
||||
break;
|
||||
case GD_CPYFOLDER:
|
||||
tchar = "CopyFolder"; //복사폴더 설정시 info.ini에 넣어주셈
|
||||
break;
|
||||
}
|
||||
|
||||
CStdioFile Txt_File;
|
||||
BOOL bGetText = FALSE;
|
||||
Iter iter = m_vecCreateFileName.begin();
|
||||
if(Txt_File.Open(strFilePath, CFile::modeRead | CFile::typeText))
|
||||
{
|
||||
CString str, strToken, strToken1;
|
||||
CString tFindKey, strNum, strChangeNum;
|
||||
int iCnt = 0 ;
|
||||
tFindKey += '[';
|
||||
strNum.Format(_T("%d"),iCnt+1);
|
||||
tFindKey += strNum;
|
||||
tFindKey += ']';
|
||||
while(Txt_File.ReadString(str))
|
||||
{
|
||||
if(iCnt > m_iServerCnt)
|
||||
break;
|
||||
if(!bGetText && str.Find(tFindKey)!= -1)
|
||||
{
|
||||
++iCnt;
|
||||
strNum.Format(_T("%d"), iCnt+1);
|
||||
strChangeNum.Format(_T("%d"), iCnt);
|
||||
tFindKey.Replace(strChangeNum, strNum);
|
||||
bGetText = TRUE;
|
||||
}
|
||||
if(bGetText && str.Find((LPWSTR)(LPCWSTR)tchar)!= -1)
|
||||
{
|
||||
str += '='; //종료 문자열을 맨 뒤에 넣는다.
|
||||
AfxExtractSubString(strToken, str, 0, '=');
|
||||
AfxExtractSubString(strToken, str, 1, '=');
|
||||
strToken.TrimLeft(); //왼쪽 공백 제거
|
||||
m_vecINIFolderAddr.push_back(strToken);
|
||||
if(iType == GD_INIPATH) //위치 조립
|
||||
{
|
||||
strToken += '\\';
|
||||
strToken += tchar;
|
||||
}
|
||||
(*DestData).push_back(strToken);
|
||||
bGetText = false; //다음꺼 읽자
|
||||
//생성할 출력 폴더 명을 얻습니다.
|
||||
str.MakeReverse();
|
||||
AfxExtractSubString(strToken1, str, 0, '\\');
|
||||
AfxExtractSubString(strToken1, str, 1, '\\');
|
||||
strToken1.MakeReverse();
|
||||
m_vecOutFolderName.push_back(strToken1);
|
||||
//생성할 출력파일 폴더명을 얻습니다.
|
||||
(*iter) += '\\';
|
||||
(*iter) += strToken1;
|
||||
(*iter) += '\\';
|
||||
++iter;
|
||||
}
|
||||
}
|
||||
}
|
||||
Txt_File.Close();
|
||||
}
|
||||
|
||||
//crcReader을 실행하고, 값을 저장한 후 생성된 crc.txt파일을 삭제합니다.
|
||||
void CCRCManager::RunCRCnDelete()
|
||||
{
|
||||
//CRC 리더 실행 및 복사했던 파일 삭제
|
||||
Iter iter = m_vecINIFolderAddr.begin();
|
||||
//for(int i = 0; i < m_iServerCnt; ++i)
|
||||
{
|
||||
SetCurrentDirectory(*iter);
|
||||
CString DelStr = *iter;
|
||||
CString strCRCtxtPath = *iter;
|
||||
CString strCRCFolderPath = *iter;
|
||||
DelStr += '\\';
|
||||
strCRCtxtPath += '\\';
|
||||
strCRCtxtPath += CRC_EXE_FILE_NAME;
|
||||
|
||||
int iResult = (int)::ShellExecute(NULL, TEXT("open"), strCRCtxtPath, NULL, NULL, SW_SHOW);
|
||||
//에러 체크
|
||||
if(iResult != TRUE)
|
||||
switch(iResult)
|
||||
{
|
||||
case ERROR_FILE_NOT_FOUND:
|
||||
MessageBoxW(g_hWnd,L"파일이 없습니다.",L"FAILED CRCReader",MB_OK);
|
||||
break;
|
||||
}
|
||||
WaitTime(1000); //1초간 기다립니다.
|
||||
LoadCRCTxtData(&strCRCFolderPath); //경로에서 CRCtxt의 값을 읽어옵니다.
|
||||
|
||||
WaitTime(1500); //1.5초간 기다립니다.
|
||||
FindWindowNClose("Crc.txt - 메모장");
|
||||
DeletePathInFile(&DelStr, AUTO_UP_EXE);
|
||||
DeletePathInFile(&DelStr, CRC_EXE_FILE_NAME);
|
||||
DeletePathInFile(&DelStr, CRC_TXT_FILE_NAME);
|
||||
++iter;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//대기 시간을 설정합니다.
|
||||
void CCRCManager::WaitTime( DWORD dwMilliSec )
|
||||
{
|
||||
DWORD dwStart = GetTickCount();
|
||||
while(GetTickCount() - dwStart < dwMilliSec)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
//info.ini에서 서버 정보를 읽어들이고 갯수만큼 vector를 예약합니다.
|
||||
//현재 실행파일의 경로를 통해 상대적인 경로로 파일을 찾습니다.
|
||||
void CCRCManager::CheckServerInfo()
|
||||
{
|
||||
char szName[MAX_PATH]={0,};
|
||||
GetCurrentDirectory(MAX_PATH,(LPWSTR)szName); //현재 경로 얻기
|
||||
int i = 0;
|
||||
AddStringToChar(&m_strInfoIniPath, szName);
|
||||
|
||||
//출력 폴더 지정
|
||||
m_strExportTxtAddr = m_strInfoIniPath;
|
||||
m_strExportTxtAddr += "\\Output";
|
||||
|
||||
m_strInfoIniPath += "\\bin";
|
||||
CString strUp = m_strInfoIniPath;
|
||||
strUp += '\\';
|
||||
strUp += AUTO_UP_EXE;
|
||||
m_vecUploadlist.push_back(strUp);
|
||||
|
||||
//Info파일 있니?
|
||||
if(!CheckFileInFolder( &m_strInfoIniPath,"Info.ini"))
|
||||
PrintMessage(MC_FILE, "Info.ini");
|
||||
|
||||
CString Tstr;
|
||||
GetINIData(&m_strInfoIniPath, "Info.ini", GD_SERVERCNT, &Tstr);
|
||||
//GetINIData(&m_strInfoIniPath, "Info.ini", GD_CHAGEDATA, &m_strChangeDataName);
|
||||
//FTP정보 가져옴
|
||||
GetINIData(&m_strInfoIniPath, "Info.ini", GD_IP, &m_strIP);
|
||||
GetINIData(&m_strInfoIniPath, "Info.ini", GD_ID, &m_strID);
|
||||
GetINIData(&m_strInfoIniPath, "Info.ini", GD_PW, &m_strPW);
|
||||
m_iServerCnt = _ttoi(Tstr);
|
||||
|
||||
//서버 갯수로 vector 초기화
|
||||
m_vecOutFolderName.reserve(m_iServerCnt);
|
||||
m_vecINIAddrData.reserve(m_iServerCnt);
|
||||
m_vecURLAddr.reserve(m_iServerCnt);
|
||||
m_vecURLData.reserve(m_iServerCnt);
|
||||
m_vecAutoEXE.reserve(m_iServerCnt);
|
||||
m_vecAutoInfo.reserve(m_iServerCnt);
|
||||
m_vecMGameInfo.reserve(m_iServerCnt);
|
||||
m_vecCreateFileName.reserve(m_iServerCnt);
|
||||
for(int i = 0 ; i < m_iServerCnt; ++i)
|
||||
{
|
||||
m_vecCreateFileName.push_back(m_strExportTxtAddr);
|
||||
}
|
||||
}
|
||||
|
||||
//info.ini정보를 읽습니다.
|
||||
void CCRCManager::LoadInfoINI()
|
||||
{
|
||||
//ini파일에서 정보 읽어 오자!
|
||||
GetINIData(&m_strInfoIniPath, "Info.ini", GD_INIPATH, &m_vecINIAddrData, m_iServerCnt); //서버에 따른 start.ini의 경로를 로드합니다.
|
||||
GetINIData(&m_strInfoIniPath, "Info.ini", GD_AUTOEXEPATH, &m_strAutoExeFolderAddr);
|
||||
GetINIData(&m_strInfoIniPath, "Info.ini", GD_CRCPATH, &m_strCrcReaderAddr);
|
||||
}
|
||||
|
||||
//파일 경로를 복사합니다.
|
||||
void CCRCManager::CopyFilePath( CString* const strSour, char* ctext)
|
||||
{
|
||||
Iter iter = m_vecINIFolderAddr.begin();
|
||||
for(int i = 0 ; i < m_iServerCnt ; ++i)
|
||||
{
|
||||
CString Sour, Dest;
|
||||
Sour = *strSour;
|
||||
Sour += '\\';
|
||||
AddStringToChar(&Sour, ctext);
|
||||
Dest = *iter;
|
||||
Dest += '\\';
|
||||
AddStringToChar(&Dest, ctext); //이제 복사 시작하면 된다
|
||||
CopyFile(Sour, Dest, FALSE);
|
||||
++iter;
|
||||
}
|
||||
}
|
||||
|
||||
//CString에다가 char를 붙입니다.
|
||||
void CCRCManager::AddStringToChar( CString* sSour, char* ctext )
|
||||
{
|
||||
int i = 0;
|
||||
while(TRUE)
|
||||
{
|
||||
*sSour += (ctext + i);
|
||||
i+=2;
|
||||
if(*(ctext + 1) != NULL) //char 저장 형태에 때라 복사 방식이 다룸~~
|
||||
return;
|
||||
if(*(ctext + i) == NULL)
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
//crc.txt파일에서 정보를 얻어들여 저장합니다.
|
||||
void CCRCManager::LoadCRCTxtData( CString* sSour )
|
||||
{
|
||||
CString szTempTxT = *sSour;
|
||||
szTempTxT += '\\';
|
||||
szTempTxT += CRC_TXT_FILE_NAME;
|
||||
int iCount = 0;
|
||||
CStdioFile Txt_File;
|
||||
char* pChar = NULL;
|
||||
int iValue = 2;
|
||||
WaitTime(1200);
|
||||
if(Txt_File.Open(szTempTxT, CFile::modeRead | CFile::typeText))
|
||||
{
|
||||
CString str, strData;
|
||||
while(Txt_File.ReadString(str))
|
||||
{
|
||||
pChar = LPSTR(LPCTSTR(str));
|
||||
if(str.Find(L"autoupgrade_info.ini") != -1 && iCount == 0)
|
||||
{
|
||||
for(;(*(pChar+iValue))!='\n'; pChar += iValue) //맨 마지막 까지 증가
|
||||
{
|
||||
if((*(pChar)=='0') || (*(pChar+iValue))=='\n') //값이 0이면 종료
|
||||
break;
|
||||
else if(*(pChar)>'0' && *(pChar)<='9') //0이 아니면
|
||||
{
|
||||
iValue = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
strData.Format(L"%s",pChar);
|
||||
m_vecAutoInfo.push_back(strData);
|
||||
++iCount;
|
||||
}
|
||||
if(str.Find(L"autoupgrade.exe") != -1 && iCount == 1)
|
||||
{
|
||||
for(;(*(pChar+iValue))!='\n'; pChar += iValue) //맨 마지막 까지 증가
|
||||
{
|
||||
if((*(pChar)=='0') || (*(pChar+iValue))=='\n') //값이 0이면 종료
|
||||
break;
|
||||
else if(*(pChar)>'0' && *(pChar)<='9') //0이 아니면
|
||||
{
|
||||
iValue = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
strData.Format(L"%s",pChar);
|
||||
m_vecAutoEXE.push_back(strData);
|
||||
++iCount;
|
||||
}
|
||||
if(str.Find(L"autoupgrade_info_mgame.ini") != -1 /*&& iCount == 2*/)
|
||||
{
|
||||
for(;(*(pChar+iValue))!='\n'; pChar += iValue) //맨 마지막 까지 증가
|
||||
{
|
||||
if((*(pChar)=='0') || (*(pChar+iValue))=='\n') //값이 0이면 종료
|
||||
break;
|
||||
else if(*(pChar)>'0' && *(pChar)<='9') //0이 아니면
|
||||
{
|
||||
iValue = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
strData.Format(L"%s",pChar);
|
||||
m_vecMGameInfo.push_back(strData);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//윈도우 창을 닫습니다.
|
||||
void CCRCManager::FindWindowNClose( char* ctext )
|
||||
{
|
||||
CString tStr;
|
||||
AddStringToChar(&tStr, ctext);
|
||||
HWND hExit = NULL;
|
||||
hExit = ::FindWindow(NULL, (LPWSTR)(LPCWSTR)tStr); //창을 닫자!
|
||||
::SendMessage(hExit, WM_CLOSE,0,0);
|
||||
}
|
||||
|
||||
//해당 경로에 파일을 삭제합니다.
|
||||
void CCRCManager::DeletePathInFile( CString* sPath, char* ctext )
|
||||
{
|
||||
//테스트용
|
||||
SetCurrentDirectory(*sPath);
|
||||
CStdioFile Txt_File;
|
||||
CString str;
|
||||
AddStringToChar(&str, ctext);
|
||||
Txt_File.Remove(str);
|
||||
}
|
||||
|
||||
//배포할 폴더를 생성합니다.
|
||||
void CCRCManager::CreateExportFolder()
|
||||
{
|
||||
for(int i = 0 ; i < m_iServerCnt ; ++i)
|
||||
{
|
||||
MakeFolder(&m_strExportTxtAddr, &m_vecOutFolderName[i]);
|
||||
}
|
||||
}
|
||||
|
||||
//폴더를 생성합니다.
|
||||
void CCRCManager::MakeFolder( CString* strPath, CString* StrName )
|
||||
{
|
||||
CFileFind CFileFinder;
|
||||
CString strExportFolderAddr;
|
||||
|
||||
strExportFolderAddr += *strPath;
|
||||
strExportFolderAddr += '\\';
|
||||
strExportFolderAddr += *StrName;
|
||||
|
||||
if(!CFileFinder.FindFile(strExportFolderAddr)) //디렉토리가 음슴
|
||||
CreateDirectory(strExportFolderAddr, NULL);
|
||||
else //있음
|
||||
return;
|
||||
}
|
||||
|
||||
//crcdata를 얻어옵니다.
|
||||
CString CCRCManager::GetCrcData(int m_iChangeDateType)
|
||||
{
|
||||
CString strData;
|
||||
//crc파일에서 변경할 데이터를 찾아 전달합니다.
|
||||
Iter cIAuto, cIAutoInfo, cIMGame;
|
||||
cIAuto = m_vecAutoEXE.begin();
|
||||
cIAutoInfo = m_vecAutoInfo.begin();
|
||||
cIMGame = m_vecMGameInfo.begin();
|
||||
switch(m_iChangeDateType)
|
||||
{
|
||||
case DI_AUTOEXE:
|
||||
return *cIAuto;
|
||||
break;
|
||||
case DI_AUTOINFO :
|
||||
return *cIAutoInfo;
|
||||
break;
|
||||
case DI_MGAMEINI:
|
||||
return *cIMGame;
|
||||
break;
|
||||
}
|
||||
|
||||
// //if(m_strChangeDataName.Find(L"autoupgrade.exe") != -1)
|
||||
// {
|
||||
// strData = m_vecAutoEXE[0];
|
||||
// //m_iChangeDateType = DI_AUTOEXE;
|
||||
// }
|
||||
// //else if(m_strChangeDataName.Find(L"mgame.ini") != -1)
|
||||
// {
|
||||
// strData = m_vecMGameInfo[0];
|
||||
// //m_iChangeDateType = DI_MGAMEINI;
|
||||
// }
|
||||
// //else {
|
||||
// strData = m_vecAutoInfo[0];
|
||||
// //m_iChangeDateType = DI_AUTOINFO;
|
||||
// }
|
||||
|
||||
return strData;
|
||||
}
|
||||
|
||||
//베이스서버(ftp로 정보를 얻는 Alpha)외에 기타 서버의 정보를 변경할 때
|
||||
//기타 서버의 하위 서버의 갯수를 파악합니다.
|
||||
int CCRCManager::GetOtherServerCnt(int iOther)
|
||||
{
|
||||
CString Tstr;
|
||||
GetINIData(&m_strInfoIniPath, "Info.ini", iOther, &Tstr);
|
||||
return _ttoi(Tstr);
|
||||
}
|
||||
|
||||
//기타 서버의 url정보를 얻어옵니다.
|
||||
void CCRCManager::GetOtherServerURL( pVecString vec, int iCnt, int iSvrName)
|
||||
{
|
||||
GetURLData(&m_strInfoIniPath, "Info.ini", vec, iCnt, iSvrName);
|
||||
}
|
||||
|
||||
|
||||
void CCRCManager::GetURLData( CString* sPath, char* SourFile, pVecString pDest, int iSvrNum ,int iSvrName)
|
||||
{
|
||||
CString str;
|
||||
str += *sPath;
|
||||
str += '\\';
|
||||
AddStringToChar(&str, SourFile);
|
||||
CString strStartText;
|
||||
switch(iSvrName)
|
||||
{
|
||||
case GD_BETACNT :
|
||||
strStartText = "[BETA]";
|
||||
break;
|
||||
case GD_LIVECNT :
|
||||
strStartText = "[LIVE]";
|
||||
break;
|
||||
case GD_DEVCNT :
|
||||
strStartText = "[DEV]";
|
||||
break;
|
||||
}
|
||||
|
||||
CStdioFile Txt_File;
|
||||
BOOL bSearchStart = FALSE;
|
||||
|
||||
if(Txt_File.Open(str, CFile::modeRead | CFile::typeText))
|
||||
{
|
||||
CString str, strToken;
|
||||
while(Txt_File.ReadString(str))
|
||||
{
|
||||
if(str.Find((LPWSTR)(LPCWSTR)strStartText)!= -1)
|
||||
bSearchStart = TRUE;
|
||||
|
||||
if(str.Find(L"URL")!= -1 && bSearchStart)
|
||||
{
|
||||
str += '='; //종료 문자열을 맨 뒤에 넣는다.
|
||||
AfxExtractSubString(strToken, str, 0, '=');
|
||||
AfxExtractSubString(strToken, str, 1, '=');
|
||||
strToken.TrimLeft(); //왼쪽 공백 제거
|
||||
pDest->push_back(strToken);
|
||||
}
|
||||
if(str.Find(L"END")!= -1 && bSearchStart)
|
||||
break;
|
||||
}
|
||||
}
|
||||
Txt_File.Close();
|
||||
|
||||
}
|
||||
|
||||
//url을 통해 소스를 읽습니다. 문제가 생겨 봉인
|
||||
void CCRCManager::GetSourceURLData( pVecString vecURL, pVecString vecDest, int iCnt )
|
||||
{
|
||||
Iter iter= (*vecURL).begin();
|
||||
m_iConnectCnt = 0;
|
||||
for(int i = 0 ; i < iCnt; )
|
||||
{
|
||||
//웹브라우져 소스 획득
|
||||
IWebBrowser2 *pWebBrowser = NULL;
|
||||
HRESULT hr;
|
||||
hr = OleInitialize(NULL);
|
||||
CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_LOCAL_SERVER, IID_IWebBrowser2, (LPVOID*)&pWebBrowser);
|
||||
|
||||
BSTR bstrURL = SysAllocString(*iter);
|
||||
if(pWebBrowser)
|
||||
{
|
||||
VARIANT vEmpty;
|
||||
VariantInit(&vEmpty);
|
||||
|
||||
hr = pWebBrowser->Navigate(bstrURL, &vEmpty, &vEmpty, &vEmpty, &vEmpty);
|
||||
}
|
||||
|
||||
WaitTime(500); //1초간 접속 기다림
|
||||
|
||||
IHTMLDocument2* pHTMLDocument;
|
||||
LPDISPATCH lpDispatch;
|
||||
HRESULT hrDispatch;
|
||||
hrDispatch = pWebBrowser->get_Document(&lpDispatch);
|
||||
|
||||
if(m_iConnectCnt > 20)
|
||||
{
|
||||
PrintMessage(MC_INTERNET,"lpDispatch 값이 입력되지 않았습니다. 대기 시간을 수정해주세요.\n(최대 대기시간 10초)");
|
||||
}
|
||||
if(!hrDispatch || lpDispatch == NULL )
|
||||
{
|
||||
++m_iConnectCnt;
|
||||
continue;
|
||||
}
|
||||
|
||||
if(lpDispatch)
|
||||
{
|
||||
HRESULT hr;
|
||||
hr = lpDispatch->QueryInterface(IID_IHTMLDocument2, (LPVOID*)&pHTMLDocument);
|
||||
lpDispatch->Release();
|
||||
WaitTime(500); //0.5초간 접속 기다림
|
||||
IHTMLElement* pBody;
|
||||
hr = pHTMLDocument->get_body(&pBody);
|
||||
BSTR bstr;
|
||||
pBody->get_innerHTML(&bstr);
|
||||
int nLen;
|
||||
char* szTarget;
|
||||
CString Tstr;
|
||||
nLen = (int)wcslen(bstr) * 2 + 1;
|
||||
szTarget = new char[nLen];
|
||||
::WideCharToMultiByte(CP_ACP, 0, bstr, -1, szTarget, nLen, NULL, NULL);
|
||||
Tstr = szTarget;
|
||||
if(*szTarget == NULL)
|
||||
{
|
||||
PrintMessage(MC_INTERNET, "인터넷 경로를 확인해 주세요."); //경로 값을 읽어오지 못합니다.
|
||||
}
|
||||
(*vecDest).push_back(Tstr);
|
||||
Iter iterData= (*vecDest).end();
|
||||
--iterData;
|
||||
(*iterData).Replace(L"<pre>",L"");
|
||||
(*iterData).Replace(L"</pre>",L"");
|
||||
SysFreeString(bstr);
|
||||
pBody->Release();
|
||||
|
||||
++i, ++iter;
|
||||
|
||||
delete szTarget;
|
||||
}
|
||||
|
||||
pWebBrowser->Quit();
|
||||
SysFreeString(bstrURL);
|
||||
pWebBrowser->Release();
|
||||
OleUninitialize();
|
||||
}
|
||||
}
|
||||
|
||||
void CCRCManager::ChangeURLData( pVecString vUrlData, int iChangeType, int iSvrCnt, int iChangeValue )
|
||||
{
|
||||
iChangeType = DI_AUTOEXE;
|
||||
pVecString pVec;
|
||||
Iter iter = (*vUrlData).begin();
|
||||
switch(iChangeType)
|
||||
{
|
||||
case DI_AUTOEXE:
|
||||
pVec = &m_vecAutoEXE;
|
||||
break;
|
||||
case DI_MGAMEINI:
|
||||
pVec = &m_vecMGameInfo;
|
||||
break;
|
||||
case DI_AUTOINFO:
|
||||
pVec = &m_vecAutoInfo;
|
||||
break;
|
||||
}
|
||||
CString strChangeValue = (*pVec)[iChangeValue];
|
||||
CString tStr;
|
||||
|
||||
int i = (*vUrlData).size();
|
||||
if(i != iSvrCnt)
|
||||
{
|
||||
iSvrCnt = i;
|
||||
PrintMessage(MC_INTERNET, "URL Data를 제대로 가져오지 못했습니다. 결과를 확인해주세요");
|
||||
}
|
||||
|
||||
for(int i = 0 ; i < iSvrCnt ; ++i, ++iter)
|
||||
{
|
||||
if(iChangeType == DI_AUTOEXE &&(*iter).Find(L"autoupgrade.exe?") != -1) //문자열 찾았으니 시작
|
||||
{
|
||||
AfxExtractSubString(tStr, (*iter), 0, '?'); //?앞까지 버리기
|
||||
AfxExtractSubString(tStr, (*iter), 1, '?'); //특정 문자 자르기
|
||||
(*iter).Replace(tStr, strChangeValue);
|
||||
}
|
||||
if(iChangeType == DI_MGAMEINI &&(*iter).Find(L"autoupgrade_info_mgame.ini?") != -1) //문자열 찾았으니 시작
|
||||
{
|
||||
AfxExtractSubString(tStr, (*iter), 0, '?'); //?앞까지 버리기
|
||||
AfxExtractSubString(tStr, (*iter), 1, '?'); //특정 문자 자르기
|
||||
(*iter).Replace(tStr, strChangeValue);
|
||||
}
|
||||
if(iChangeType == DI_AUTOINFO &&(*iter).Find(L"autoupgrade_info.ini?") != -1) //문자열 찾았으니 시작
|
||||
{
|
||||
AfxExtractSubString(tStr, (*iter), 0, '?'); //?앞까지 버리기
|
||||
AfxExtractSubString(tStr, (*iter), 1, '?'); //특정 문자 자르기
|
||||
(*iter).Replace(tStr, strChangeValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CCRCManager::CreateTxtFileInFolder( pVecString vURLAddr, pVecString vURLData, pVecString vOutputPath, int iSvrCnt, int iType )
|
||||
{
|
||||
Iter iterAddr, iterData;
|
||||
CStdioFile Txt_File;
|
||||
iterAddr = (*vURLAddr).begin();
|
||||
iterData = (*vURLData).begin();
|
||||
CString strPath;
|
||||
CString strOutPath = (*vOutputPath)[iType];
|
||||
int i = (*vURLData).size();
|
||||
if(i != iSvrCnt)
|
||||
{
|
||||
iSvrCnt = i;
|
||||
PrintMessage(MC_INTERNET, "URL Data를 제대로 가져오지 못했습니다. 결과를 확인해주세요");
|
||||
}
|
||||
for(int i = 0 ; i < iSvrCnt ; ++i)
|
||||
{
|
||||
//생성할 파일명을 찾습니다.
|
||||
CString strMakeFileName;
|
||||
strPath = strOutPath;
|
||||
(*iterAddr).MakeReverse();
|
||||
AfxExtractSubString(strMakeFileName, (*iterAddr), 0,'/');
|
||||
(*iterAddr).MakeReverse();
|
||||
strMakeFileName.MakeReverse();
|
||||
strPath += '\\';
|
||||
strPath += strMakeFileName;
|
||||
//파일을 만든다
|
||||
if(Txt_File.Open(strPath, CFile::modeCreate | CFile::modeWrite | CFile::typeText))
|
||||
{
|
||||
Txt_File.WriteString(*iterData);
|
||||
}
|
||||
Txt_File.Close();
|
||||
if(i < iSvrCnt-1 )
|
||||
{
|
||||
++iterData;
|
||||
++iterAddr;
|
||||
}
|
||||
//끗
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void CCRCManager::OtherServerProcess()
|
||||
{
|
||||
int iOtherServerCount = 0;
|
||||
int iServerNumInOtherServer[SERVER_MAX];
|
||||
//CString strCrcData = GetCrcData(); //Crc값
|
||||
//int iChangeType= GetChangeDataType(); //DI_AUTOEXE ~ DI_MGAMEINI
|
||||
|
||||
if(m_iServerCnt > 1) //서버 갯수가 하나가 이나라면 작업해이이잉~~
|
||||
{
|
||||
iOtherServerCount = GetOtherServerCnt(GD_OTHERSVRCNT);
|
||||
}
|
||||
//각 Other서버의 안에 있는 서버의 갯수를 얻어옵니다.
|
||||
|
||||
for(int i = 0 ; i < iOtherServerCount ; ++i)
|
||||
{
|
||||
if(i == SERVER_ZERO )
|
||||
{
|
||||
GetOtherServerURL(&m_vecOtherSvrURL1, iServerNumInOtherServer[i], GD_BETACNT+SERVER_ZERO);
|
||||
DownloadWebFileInFolder(&m_vecCreateFileName, &m_vecOtherSvrURL1, SD_BETA, 3);
|
||||
CreateChangeDataTxtFile(&m_vecOtherFilePath, SD_BETA); //파일에서 읽고 변경할 값으로 변경한다.
|
||||
//CreateTxtFileInFolder(&m_vecOtherSvrURL1, &m_vecOtherSvrURLData1, &m_vecCreateFileName, iServerNumInOtherServer[i], SD_BETA ); //값 변경
|
||||
}
|
||||
if(i == SERVER_ONE )
|
||||
{
|
||||
GetOtherServerURL(&m_vecOtherSvrURL2, iServerNumInOtherServer[i], GD_BETACNT+SERVER_ONE);
|
||||
DownloadWebFileInFolder(&m_vecCreateFileName, &m_vecOtherSvrURL2, SD_LIVE, 3);
|
||||
CreateChangeDataTxtFile(&m_vecOtherFilePath, SD_LIVE); //파일에서 읽고 변경할 값으로 변경한다.
|
||||
}
|
||||
if(i == SERVER_THREE )
|
||||
{
|
||||
GetOtherServerURL(&m_vecOtherSvrURL3, iServerNumInOtherServer[i], GD_BETACNT+SERVER_TWO);
|
||||
DownloadWebFileInFolder(&m_vecCreateFileName, &m_vecOtherSvrURL3, SD_DEV, 3);
|
||||
CreateChangeDataTxtFile(&m_vecOtherFilePath, SD_DEV); //파일에서 읽고 변경할 값으로 변경한다.
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void CCRCManager::DownloadWebFileInFolder( pVecString vecPath, pVecString vecURL, int iType, int iTryCnt)
|
||||
{
|
||||
m_vecOtherFilePath.clear();
|
||||
CString strFolderAddr = (*vecPath)[iType];
|
||||
Iter iter= (*vecURL).begin();
|
||||
HRESULT hr;
|
||||
CString str, strPath, strToken, strFileName, dwUrl, strBefore;
|
||||
str = (*iter);
|
||||
str.MakeReverse();
|
||||
AfxExtractSubString(strToken, str, 0, '/'); //'/'앞까지 버리기
|
||||
strToken.MakeReverse();
|
||||
|
||||
for(int i =0 ; i < SERVER_MAX; ++i)
|
||||
{
|
||||
strBefore = strToken; //start.txt 파일이름 저장
|
||||
dwUrl = (*iter); //기존 url 받고
|
||||
strFileName = strFolderAddr;
|
||||
if(i != 0)
|
||||
{
|
||||
CString tStr;
|
||||
tStr.Format(L"%d", i); //1~2,3
|
||||
tStr +=".txt";
|
||||
strBefore.Replace(L".txt", tStr); //start1.txt 식으로 숫자 넣어주자
|
||||
}
|
||||
dwUrl.Replace(strToken, strBefore); //텍스트명 변경
|
||||
strFileName += strBefore;
|
||||
for(int j = 0 ; j < iTryCnt; ++j)
|
||||
{
|
||||
hr = URLDownloadToFile(NULL, dwUrl, strFileName, 0, NULL);
|
||||
if(hr == S_OK)
|
||||
{
|
||||
DeleteUrlCacheEntry(dwUrl);
|
||||
m_strLog = L"";
|
||||
m_strLog += strFileName;
|
||||
m_strLog += L"다운로드 완료!";
|
||||
PrintLog(&m_strLog);
|
||||
m_vecOtherFilePath.push_back(strFileName);
|
||||
break; //다운 받았으면 종료해잉!
|
||||
}
|
||||
}
|
||||
if(hr == E_FAIL)
|
||||
PrintLog("다운로드 실패 접속경로를 확인해주세요");
|
||||
}
|
||||
}
|
||||
|
||||
void CCRCManager::PrintLog( CString* str )
|
||||
{
|
||||
(*m_CRCDlg).PrintWorkLog(str);
|
||||
}
|
||||
|
||||
void CCRCManager::PrintLog( char* str )
|
||||
{
|
||||
CString Tstr(str);
|
||||
(*m_CRCDlg).PrintWorkLog(&Tstr);
|
||||
}
|
||||
|
||||
void CCRCManager::CreateChangeDataTxtFile(pVecString vecPath , int iType)
|
||||
{
|
||||
//변경할 CRC 데이터를 가져옵니다.
|
||||
CString strToken;
|
||||
Iter iterPath = (*vecPath).begin(); //읽어들이고 저장할 파일이름
|
||||
|
||||
CStdioFile Txt_File;
|
||||
|
||||
for(;iterPath < (*vecPath).end(); ++iterPath)
|
||||
{
|
||||
CString strSaveData;
|
||||
if(Txt_File.Open(*iterPath, CFile::modeRead | CFile::typeText))
|
||||
{
|
||||
CString strTXT;
|
||||
while(Txt_File.ReadString(strTXT))
|
||||
{
|
||||
if(strTXT.Find(L"autoupgrade.exe?") != -1) //문자열 찾았으니 시작
|
||||
{
|
||||
AfxExtractSubString(strToken, strTXT, 0, '?'); //?앞까지 버리기
|
||||
AfxExtractSubString(strToken, strTXT, 1, '?'); //특정 문자 자르기
|
||||
strTXT.Replace(strToken, GetCrcData(DI_AUTOEXE));
|
||||
}
|
||||
|
||||
AfxExtractSubString(strToken, strTXT, 2, '?'); //?앞까지 버리기
|
||||
AfxExtractSubString(strToken, strTXT, 3, '?'); //특정 문자 자르기
|
||||
if(iType == SD_BETA) //문자열 찾았으니 시작
|
||||
strTXT.Replace(strToken, GetCrcData(DI_MGAMEINI));
|
||||
if(iType == SD_LIVE) //문자열 찾았으니 시작
|
||||
strTXT.Replace(strToken, GetCrcData(DI_AUTOINFO));
|
||||
strSaveData = strTXT;
|
||||
}
|
||||
}
|
||||
Txt_File.Close();
|
||||
|
||||
//파일을 만든다
|
||||
if(Txt_File.Open(*iterPath, CFile::modeCreate | CFile::modeWrite | CFile::typeText))
|
||||
{
|
||||
Txt_File.WriteString(strSaveData);
|
||||
}
|
||||
Txt_File.Close();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,109 @@
|
||||
#pragma once
|
||||
#include <vector>
|
||||
|
||||
|
||||
typedef std::vector<CString> VecString;
|
||||
typedef std::vector<CString>* pVecString;
|
||||
typedef std::vector<CString>::iterator Iter;
|
||||
typedef std::vector<CString>::const_iterator CIter;
|
||||
|
||||
class OneCRCDlg;
|
||||
class CCRCManager
|
||||
{
|
||||
enum WORK_PROC { _FILECHECK, _COPYnRUN, _MAKEFILE,_WORKCOMPLETE };
|
||||
enum MESSAGE_CODE { MC_FILE, MC_URL, MC_INTERNET, MC_ALERT};
|
||||
enum GET_DATA { GD_INIPATH, GD_SERVERCNT,GD_AUTOEXEPATH, GD_CRCPATH, GD_CPYFOLDER, GD_CHAGEDATA,GD_URL, GD_IP, GD_ID, GD_PW,GD_LOCAL,
|
||||
GD_OTHERSVRCNT, GD_BETACNT, GD_LIVECNT , GD_DEVCNT, GD_BETAURL, GD_LIVEURL};
|
||||
enum SERVER_ID { SERVER_ZERO, SERVER_ONE, SERVER_TWO, SERVER_THREE ,SERVER_MAX};
|
||||
enum SERVER_DATA { SD_ALPHA, SD_BETA, SD_LIVE ,SD_DEV};
|
||||
|
||||
#define CRC_EXE_FILE_NAME "CrcReader.exe" //실행파일
|
||||
#define CRC_TXT_FILE_NAME "Crc.txt" //삭제파일
|
||||
|
||||
public:
|
||||
static CCRCManager* GetInst();
|
||||
static void ReleaseInst();
|
||||
|
||||
void RunProcess();
|
||||
CString GetCrcData(int iDataType);
|
||||
//int GetChangeDataType() { return m_iChangeDateType; };
|
||||
void SetDlg(OneCRCDlg* dlg) { m_CRCDlg = dlg; }; //SET
|
||||
void OtherServerProcess();
|
||||
CCRCManager(void);
|
||||
virtual ~CCRCManager(void);
|
||||
private:
|
||||
//함수
|
||||
void PrintMessage(int iType, char* ctext); //텍스터 출력
|
||||
void ChangeFontString(TCHAR* pSour, char* pDest); //문자열 변경
|
||||
void CopyFilePath(CString* const strSour, char* ctext);
|
||||
void RunCRCnDelete();
|
||||
void WaitTime( DWORD dwMilliSec ); //타이머
|
||||
void AddStringToChar(CString* sSour, char* ctext);
|
||||
void LoadCRCTxtData(CString* sSour); //CRC 데이터 로드
|
||||
void FindWindowNClose(char* ctext); //창 찾아 닫기
|
||||
void DeletePathInFile(CString* sPath, char* ctext); //파일을 삭제하자
|
||||
//CHECK
|
||||
BOOL CheckFileInFolder(CString* const strPath, char* ctext ); //파일 체크
|
||||
void CheckServerInfo(); //데이터를 생성할 서버에 갯수를 파악합니다.
|
||||
//CREATE
|
||||
void CreateExportFolder(); //Output\출력폴더 생성
|
||||
void MakeFolder(CString* strPath, CString* StrName); //출력폴더 경로 설정
|
||||
|
||||
//GET
|
||||
void LoadInfoINI();
|
||||
void GetINIData(CString* const FilePath, char* SourFile, int iType, CString* DestData);
|
||||
void GetINIData(CString* const FilePath, char* SourFile, int iType, std::vector<CString>* DestData, int ServerCnt);
|
||||
void GetINIData(std::vector<CString>* vecAddr, char* SourFile, int iType, std::vector<CString>* DestData, int ServerCnt);
|
||||
|
||||
//
|
||||
int GetOtherServerCnt(int iOther); //씀
|
||||
void GetOtherServerURL(pVecString vec, int iCnt, int iSvrName); //씀
|
||||
void GetURLData(CString* sPath, char* SourFile, pVecString pDest, int iSvrNum, int iSvrName); //안씀
|
||||
void GetSourceURLData(pVecString vecURL, pVecString vecDest, int iCnt);
|
||||
void GetSourceOfURL(CString urlAddr);
|
||||
void ChangeURLData(pVecString vUrlData, int iChangeType, int iSvrCnt, int iChangeValue);
|
||||
void CreateTxtFileInFolder(pVecString vURLAddr, pVecString vURLData, pVecString vOutputPath, int iSvrCnt, int iType);
|
||||
|
||||
//새로운 other 서버 관련 작업
|
||||
void DownloadWebFileInFolder(pVecString vecPath, pVecString vecURL, int iType, int iTryCnt);
|
||||
void PrintLog(CString* str);
|
||||
void PrintLog( char* str );
|
||||
void CreateChangeDataTxtFile(pVecString vecPath, int iType);
|
||||
//변수
|
||||
static CCRCManager *g_Inst; //인수
|
||||
int m_iProcessStep;
|
||||
//CString m_strChangeDataName; //변경할 데이터 이름
|
||||
CString m_strInfoIniPath; //D:\Jal_overseas\Indonesia\Tool\OneclickCRC\bin
|
||||
CString m_strAutoExeFolderAddr;
|
||||
CString m_strCopyFolderAddr;
|
||||
CString m_strCrcReaderAddr;
|
||||
CString m_strExportTxtAddr; //D:\Jal_overseas\Indonesia\Tool\OneclickCRC\Output
|
||||
VecString m_vecOutFolderName; //출력 폴더 명 저장
|
||||
VecString m_vecINIAddrData; //INI 파일경로 저장
|
||||
VecString m_vecURLAddr; //URL에 접속하기 위한 주소 정보
|
||||
VecString m_vecURLData; //URL에 접속하여 가져온 데이터
|
||||
VecString m_vecCreateFileName;//생성 파일 이름
|
||||
VecString m_vecINIFolderAddr; //INI 폴더 경로 저장
|
||||
VecString m_vecAutoEXE; //URL에서 읽은 정보
|
||||
VecString m_vecAutoInfo; //URL에서 읽은 정보
|
||||
VecString m_vecMGameInfo; //URL에서 읽은 정보
|
||||
VecString m_vecUploadlist; //업로드할 파일(경로)
|
||||
|
||||
int m_iServerCnt; //확인된 서버 갯수
|
||||
int m_iConnectCnt; //접속 카운트
|
||||
OneCRCDlg* m_CRCDlg;
|
||||
CString m_strIP; //FTP 접속 정보
|
||||
CString m_strID; //FTP 접속 정보
|
||||
CString m_strPW; //FTP 접속 정보
|
||||
//int m_iChangeDateType; //다운받은 txt파일에서 변경할 타입을 확인합니다.
|
||||
VecString m_vecOtherSvrURL1; //베타
|
||||
VecString m_vecOtherSvrURL2; //라이브
|
||||
VecString m_vecOtherSvrURL3; //나중에 쓸거
|
||||
VecString m_vecOtherSvrURLData1;
|
||||
VecString m_vecOtherSvrURLData2;
|
||||
VecString m_vecOtherSvrURLData3;
|
||||
VecString m_vecOtherFilePath;
|
||||
CString m_strLog;
|
||||
|
||||
};
|
||||
|
||||
@@ -0,0 +1,306 @@
|
||||
commandMap
|
||||
#include "StdAfx.h"
|
||||
#include "FTPManager.h"
|
||||
|
||||
#include "../CRC/CRCManager.h"
|
||||
|
||||
CFTPManager *CFTPManager::g_Inst = NULL;
|
||||
|
||||
CFTPManager::CFTPManager(void) :
|
||||
m_strWorkDir(_T("")), m_strDownBackUpPath(_T(""))
|
||||
{
|
||||
m_pConnection = NULL;
|
||||
m_pFileFind = NULL;
|
||||
m_CRCDlg = NULL;
|
||||
m_pSession = NULL;
|
||||
}
|
||||
|
||||
|
||||
CFTPManager::~CFTPManager(void)
|
||||
{
|
||||
if(m_pConnection != NULL)
|
||||
CloseConnection();
|
||||
|
||||
if(m_pSession != NULL)
|
||||
m_pSession->Close();
|
||||
}
|
||||
|
||||
CFTPManager* CFTPManager::GetInst()
|
||||
{
|
||||
if(NULL == g_Inst)
|
||||
g_Inst = new CFTPManager;
|
||||
return g_Inst;
|
||||
}
|
||||
|
||||
void CFTPManager::ReleaseInst()
|
||||
{
|
||||
if(g_Inst)
|
||||
delete g_Inst;
|
||||
g_Inst = NULL;
|
||||
}
|
||||
|
||||
void CFTPManager::ConnectProcess(CString* strip, CString* strid, CString* strpw)
|
||||
{
|
||||
if(!AfxSocketInit())
|
||||
AfxMessageBox(_T("소켓 초기화 실패"));
|
||||
|
||||
CString strRemoteDirTxt;
|
||||
if(m_pConnection != NULL)
|
||||
CloseConnection();
|
||||
|
||||
m_pSession = new CInternetSession(_T("New Session"));
|
||||
|
||||
try
|
||||
{
|
||||
m_pConnection = m_pSession->GetFtpConnection(*strip, *strid, *strpw);
|
||||
}
|
||||
catch (CInternetException* e)
|
||||
{
|
||||
e->ReportError();
|
||||
m_pConnection = NULL;
|
||||
m_pSession->Close();
|
||||
delete m_pSession ;
|
||||
e->Delete();
|
||||
}
|
||||
//현재 디렉토리를 얻음
|
||||
m_pConnection->GetCurrentDirectory(strRemoteDirTxt);
|
||||
|
||||
if(m_pFileFind) delete m_pFileFind; //사용시 삭제
|
||||
|
||||
CString strDir;
|
||||
m_pFileFind = new CFtpFileFind(m_pConnection);
|
||||
m_pFileFind->FindFile(strDir);
|
||||
|
||||
GetCurrentObjectList(&m_vecDir);
|
||||
//디렉토리 경로를 확인합니다.
|
||||
if(!CheckDirName(&m_vecDir, L"autoupgrade", &m_strWorkDir))
|
||||
AfxMessageBox(_T("폴더 경로(autoupgrade)를 확인해 주세요!"));
|
||||
|
||||
//디렉토리 이동
|
||||
MoveDir(&m_strWorkDir);
|
||||
GetCurrentObjectList(&m_vecFile); //디렉토리 내 파일 목록 확인
|
||||
|
||||
//백업하자 백업하자
|
||||
CreateDownloadDir();
|
||||
DownloadDataInFolder(&m_strDownBackUpPath, &m_strWorkDir, &m_vecFile);
|
||||
|
||||
//변경할 CRC 데이터를 가져옵니다.
|
||||
CString CrcEXEData = CCRCManager::GetInst()->GetCrcData(DI_AUTOEXE);
|
||||
CString CrcINFOData = CCRCManager::GetInst()->GetCrcData(DI_MGAMEINI);
|
||||
//int iChange = CCRCManager::GetInst()->GetChangeDataType(); //DI_AUTOEXE ~ DI_MGAMEINI
|
||||
ChangeMyCrcDataInList(&m_strDownBackUpPath, &m_vecFile, CrcEXEData, CrcINFOData); //autoexe값을 변경
|
||||
//업로드를 하자
|
||||
//업로드 경로는 백업하기 위해 지정된 AutoUpgrade\ 폴더에 덮어쓰기 됩니다.
|
||||
UploadFileNPath(m_pvecUpLoadList, &m_strWorkDir);
|
||||
}
|
||||
|
||||
//vec에서 txt파일을 검사하여 분류하고,
|
||||
void CFTPManager::ChangeMyCrcDataInList( CString* sPath, pVecString vecFileList, CString strExe ,CString strInfo)
|
||||
{
|
||||
//check Txt data
|
||||
Iter iterList = vecFileList->begin();
|
||||
std::vector<int> vecINum; //txt배열 정보 얻기
|
||||
int iType = TT_START;
|
||||
for(int i = 0; iterList < (vecFileList->end()); ++iterList)
|
||||
{
|
||||
if((*iterList).Find(L".txt")!= -1) //vec에서 txt넘버를 얻는다.
|
||||
vecINum.push_back(i);
|
||||
if((*iterList).Find(L"mgame")!= -1) //내가 다운받은 자료는 모두 mgame.txt일것이다.
|
||||
iType = TT_MGAME;
|
||||
++i;
|
||||
}
|
||||
ChangeTXTdata(iType, vecFileList, &vecINum, strExe, strInfo, sPath);
|
||||
}
|
||||
|
||||
void CFTPManager::ChangeTXTdata( int itype, pVecString veclist, std::vector<int>* vecInt, CString strExe, CString strInfo, CString* sPath)
|
||||
{
|
||||
CString strPath = *sPath;
|
||||
Iter iter = veclist->begin();
|
||||
int iMax = (*vecInt).size();
|
||||
if(itype == TT_MGAME) //mgame.txt에서
|
||||
{
|
||||
for(int j = 0 ; j < iMax ; ++j)
|
||||
{
|
||||
CString str;
|
||||
str = strPath;
|
||||
int iNum = (*vecInt)[j]; //벡터 결과 가져오고
|
||||
str += *(iter+iNum); //주소 값 가져오기
|
||||
ChangeCRCData(strExe, strInfo,str);
|
||||
}
|
||||
}
|
||||
else if(itype == TT_START)
|
||||
AfxMessageBox(_T("start.txt 변경은 지원하지 않습니다."));
|
||||
}
|
||||
|
||||
//결과 값을 변경합니다.
|
||||
void CFTPManager::ChangeCRCData(CString strExe, CString strInfo, CString strPath )
|
||||
{
|
||||
CString tFindKey;
|
||||
// switch(itype) //변경할 데이터를 찾자~
|
||||
// {
|
||||
// case DI_AUTOEXE :
|
||||
// tFindKey = "autoupgrade.exe?";
|
||||
// break;
|
||||
// case DI_MGAMEINI :
|
||||
// tFindKey = "autoupgrade_info_mgame.ini?";
|
||||
// break;
|
||||
// case DI_AUTOINFO :
|
||||
// tFindKey = "autoupgrade_info.ini?";
|
||||
// break;
|
||||
// }
|
||||
|
||||
CString strWriteData;
|
||||
CStdioFile Txt_File;
|
||||
if(Txt_File.Open(strPath, CFile::modeRead |CFile::typeText))
|
||||
{
|
||||
CString str, strToken;
|
||||
while(Txt_File.ReadString(str))
|
||||
{
|
||||
//if(str.Find(tFindKey) != -1)
|
||||
{
|
||||
AfxExtractSubString(strToken, str, 0, '?'); //?앞까지 버리기
|
||||
AfxExtractSubString(strToken, str, 1, '?'); //특정 문자 자르기
|
||||
str.Replace(strToken, strExe);
|
||||
AfxExtractSubString(strToken, str, 2, '?'); //?앞까지 버리기
|
||||
AfxExtractSubString(strToken, str, 3, '?'); //특정 문자 자르기
|
||||
str.Replace(strToken, strInfo);
|
||||
strWriteData = str;
|
||||
}
|
||||
}
|
||||
}
|
||||
Txt_File.Close();
|
||||
CString cstr;
|
||||
strPath.MakeReverse();
|
||||
AfxExtractSubString(cstr, strPath, 0, '\\'); //?앞까지 버리기
|
||||
AfxExtractSubString(cstr, strPath, 1, '\\'); //특정 문자 자르기
|
||||
m_strChangeFolderName.MakeReverse();
|
||||
strPath.Replace(cstr, m_strChangeFolderName);
|
||||
m_strChangeFolderName.MakeReverse();
|
||||
strPath.MakeReverse();
|
||||
m_vecUpnDelList.push_back(strPath);
|
||||
if(Txt_File.Open(strPath, CFile::modeCreate | CFile::modeWrite | CFile::typeText))
|
||||
{
|
||||
Txt_File.WriteString(strWriteData);
|
||||
}
|
||||
Txt_File.Close();
|
||||
}
|
||||
|
||||
void CFTPManager::CloseConnection()
|
||||
{
|
||||
m_pConnection->Close();
|
||||
delete m_pConnection;
|
||||
m_pConnection = NULL;
|
||||
}
|
||||
|
||||
void CFTPManager::GetCurrentObjectList( pVecString vec )
|
||||
{
|
||||
if((*vec).empty()) //있으면 지워라~
|
||||
(*vec).clear();
|
||||
|
||||
|
||||
CString strFileName;
|
||||
BOOL bFind = TRUE;
|
||||
while(bFind)
|
||||
{
|
||||
if(!m_pFileFind->FindNextFile())
|
||||
bFind = FALSE;
|
||||
strFileName = m_pFileFind->GetFileName();
|
||||
(*vec).push_back(strFileName);
|
||||
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
BOOL CFTPManager::CheckDirName( pVecString vec, CString sName, CString* strSetPath )
|
||||
{
|
||||
Iter iter = vec->begin();
|
||||
CString tStr;
|
||||
for( ; iter < (vec->end()); ++iter)
|
||||
{
|
||||
tStr = (*iter);
|
||||
if(tStr.MakeUpper()== sName.MakeUpper())
|
||||
{
|
||||
*strSetPath = *iter;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void CFTPManager::MoveDir( CString* strPath )
|
||||
{
|
||||
CString strTmpDir, strDir;
|
||||
strTmpDir += *strPath;
|
||||
strTmpDir += "\\";
|
||||
BOOL bSucess = m_pConnection->SetCurrentDirectory(strTmpDir);
|
||||
m_pFileFind->FindFile(strDir);
|
||||
}
|
||||
|
||||
void CFTPManager::DownloadDataInFolder( CString* strDownLocalPath, CString* strRemotePath, pVecString vecDonwList )
|
||||
{
|
||||
CString TempRemotePath;
|
||||
TempRemotePath += '\\';
|
||||
TempRemotePath += *strRemotePath;
|
||||
TempRemotePath += '\\';
|
||||
|
||||
Iter iter = (*vecDonwList).begin();
|
||||
for(; iter < ((*vecDonwList).end()); ++iter)
|
||||
{
|
||||
m_pConnection->GetFile(TempRemotePath + (*iter), *strDownLocalPath+ (*iter), FALSE, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_BINARY | INTERNET_FLAG_RELOAD | NULL);
|
||||
}
|
||||
}
|
||||
|
||||
void CFTPManager::SetUseData( pVecString vec, CString* str )
|
||||
{
|
||||
m_pvecUpLoadList = vec;
|
||||
m_pDownLoadPath = str;
|
||||
}
|
||||
|
||||
void CFTPManager::CreateDownloadDir()
|
||||
{
|
||||
CString strDate, strToken, strMakeDirName;
|
||||
COleDateTime NowDate;
|
||||
CFileFind CFileFinder;
|
||||
NowDate = COleDateTime::GetCurrentTime();
|
||||
|
||||
strDate.Format( L"%04d-%02d-%02d|%02d:%02d:%02d"
|
||||
, NowDate.GetYear()
|
||||
, NowDate.GetMonth()
|
||||
, NowDate.GetDay()
|
||||
, NowDate.GetHour()
|
||||
, NowDate.GetMinute()
|
||||
, NowDate.GetSecond()
|
||||
);
|
||||
|
||||
AfxExtractSubString(strToken, strDate, 0, '|'); //날짜까지 자름
|
||||
strMakeDirName = strToken;
|
||||
strMakeDirName += '_';
|
||||
strMakeDirName += m_strWorkDir;
|
||||
strMakeDirName += "_Backup";
|
||||
|
||||
CString str = *m_pDownLoadPath; //경로 받아오자잉
|
||||
m_strDownBackUpPath = str;
|
||||
m_strDownBackUpPath += '\\';
|
||||
m_strDownBackUpPath += strMakeDirName;
|
||||
if(!CFileFinder.FindFile(m_strDownBackUpPath)) //디렉토리가 음슴
|
||||
CreateDirectory(m_strDownBackUpPath, NULL);
|
||||
m_strDownBackUpPath += '\\';
|
||||
}
|
||||
|
||||
void CFTPManager::UploadFileNPath( pVecString vec, CString* strPath )
|
||||
{
|
||||
Iter Upiter = (*m_pvecUpLoadList).begin();
|
||||
for(;Upiter < (*m_pvecUpLoadList).end(); ++Upiter)
|
||||
m_vecUpnDelList.push_back(*Upiter);
|
||||
Iter iter = m_vecUpnDelList.begin();
|
||||
for(;iter < m_vecUpnDelList.end(); ++iter)
|
||||
{
|
||||
CString tStr;
|
||||
(*iter).MakeReverse();
|
||||
AfxExtractSubString(tStr, (*iter), 0, '\\'); //?앞까지 버리기
|
||||
tStr.MakeReverse();
|
||||
tStr += L"test"; //임시 세팅용 데이터
|
||||
(*iter).MakeReverse();
|
||||
m_pConnection->PutFile((*iter), tStr, INTERNET_FLAG_TRANSFER_ASCII | INTERNET_FLAG_RELOAD, 0);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
#pragma once
|
||||
|
||||
|
||||
#include <vector>
|
||||
#include <afxinet.h> //ftp 를 위해 추가해야됨
|
||||
#include <afxsock.h>
|
||||
|
||||
typedef std::vector<CString> VecString;
|
||||
typedef std::vector<CString>* pVecString;
|
||||
typedef std::vector<CString>::iterator Iter;
|
||||
typedef std::vector<CString>::const_iterator CIter;
|
||||
|
||||
|
||||
class OneCRCDlg;
|
||||
class CFTPManager
|
||||
{
|
||||
enum TXT_TYPE { TT_START, TT_MGAME };
|
||||
public:
|
||||
static CFTPManager* GetInst(); //그닥 필요없지만 싱글톤..
|
||||
static void ReleaseInst();
|
||||
CFTPManager(void);
|
||||
virtual ~CFTPManager(void);
|
||||
void SetDlg(OneCRCDlg* dlg) { m_CRCDlg = dlg; };//SET
|
||||
void SetUseData(pVecString vec, CString* str);
|
||||
void SetUploadList(pVecString vec) {m_pvecUpload = vec; } ;
|
||||
void setWorkDirPath(pVecString vec) { m_pvecWorkDirPath = vec; };
|
||||
void ConnectProcess(CString* strip, CString* strid, CString* strpw);
|
||||
void DownDataChangeFolder(CString* str) { m_strChangeFolderName = *str; };
|
||||
private:
|
||||
void ChangeCRCData(CString strExe, CString strInfo, CString strPath);
|
||||
void ChangeTXTdata(int itype, pVecString veclist, std::vector<int>* vecInt, CString strExe, CString strInfo,CString* sPath);
|
||||
void CloseConnection();
|
||||
void GetCurrentObjectList(pVecString vec);
|
||||
void MoveDir(CString* strPath);
|
||||
void CreateDownloadDir();
|
||||
void DownloadDataInFolder(CString* strDownLocalPath, CString* strRemotePath, pVecString vecDonwList);
|
||||
BOOL CheckDirName(pVecString vec, CString sName, CString* strSetPath);
|
||||
void UploadFileNPath(pVecString vec, CString* strPath);
|
||||
void ChangeMyCrcDataInList(CString* sPath, pVecString vecFileList, CString strExe ,CString strInfo);
|
||||
|
||||
static CFTPManager *g_Inst; //인수
|
||||
|
||||
//추가내용
|
||||
CInternetSession *m_pSession;
|
||||
CFtpConnection *m_pConnection;
|
||||
CFtpFileFind *m_pFileFind;
|
||||
VecString m_vecDir;
|
||||
CString m_strWorkDir;
|
||||
VecString m_vecFile;
|
||||
pVecString m_pvecUpLoadList;
|
||||
pVecString m_pvecWorkDirPath;
|
||||
pVecString m_pvecUpload;
|
||||
CString* m_pDownLoadPath;
|
||||
CString m_strDownBackUpPath;
|
||||
OneCRCDlg* m_CRCDlg;
|
||||
VecString m_vecUpnDelList;
|
||||
CString m_strChangeFolderName;
|
||||
};
|
||||
|
||||
@@ -0,0 +1,142 @@
|
||||
// OneCRCDlg.cpp : 구현 파일입니다.
|
||||
//
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "OneClickCRC.h"
|
||||
#include "OneCRCDlg.h"
|
||||
#include "afxdialogex.h"
|
||||
|
||||
|
||||
// OneCRCDlg 대화 상자입니다.
|
||||
//윈 7스타일
|
||||
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
|
||||
|
||||
//매니저
|
||||
#include "Manager/CRC/CRCManager.h"
|
||||
#include "Manager/FTP/FTPManager.h"
|
||||
|
||||
//글로벌 핸들
|
||||
HWND g_hWnd;
|
||||
|
||||
|
||||
IMPLEMENT_DYNAMIC(OneCRCDlg, CDialog)
|
||||
|
||||
OneCRCDlg::OneCRCDlg(CWnd* pParent /*=NULL*/)
|
||||
: CDialog(OneCRCDlg::IDD, pParent)
|
||||
/* , m_strLog(_T(""))*/
|
||||
{
|
||||
g_hWnd = m_hWnd;
|
||||
}
|
||||
|
||||
OneCRCDlg::~OneCRCDlg()
|
||||
{
|
||||
}
|
||||
|
||||
void OneCRCDlg::DoDataExchange(CDataExchange* pDX)
|
||||
{
|
||||
CDialog::DoDataExchange(pDX);
|
||||
|
||||
InitializationDlg();
|
||||
/* DDX_Text(pDX, IDC_EDIT1, m_strLog);*/
|
||||
DDX_Control(pDX, IDC_LIST1, m_ListBox);
|
||||
}
|
||||
|
||||
//다이얼로그 초기화 함수입니다.
|
||||
void OneCRCDlg::InitializationDlg()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
BEGIN_MESSAGE_MAP(OneCRCDlg, CDialog)
|
||||
ON_BN_CLICKED(IDOK, &OneCRCDlg::OnBnClickedOk)
|
||||
ON_BN_CLICKED(ID_CONNECT_BT, &OneCRCDlg::OnBnClickedConnectBt)
|
||||
END_MESSAGE_MAP()
|
||||
|
||||
|
||||
// OneCRCDlg 메시지 처리기입니다.
|
||||
|
||||
|
||||
void OneCRCDlg::OnBnClickedOk()
|
||||
{
|
||||
CString strLog;
|
||||
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
|
||||
m_pCRCMgr->SetDlg(this);
|
||||
m_pCRCMgr->RunProcess();
|
||||
strLog = L"FTP전송을 시작합니다.";
|
||||
PrintWorkLog(&strLog);
|
||||
m_pFTPMgr->SetDlg(this);
|
||||
m_pFTPMgr->SetUseData(m_pvecUploadListPath, m_pstrDownPath);
|
||||
m_pFTPMgr->SetUploadList(m_pvecUploadListPath);
|
||||
m_pFTPMgr->ConnectProcess(m_pstrIP, m_pstrID, m_pstrPW);
|
||||
strLog = L"FTP전송을 끝마쳤습니다.";
|
||||
PrintWorkLog(&strLog);
|
||||
|
||||
CCRCManager::GetInst()->OtherServerProcess();
|
||||
MessageBox(L"모든 작업을 끝마쳤습니다.",MB_OK);
|
||||
AfxGetMainWnd()->PostMessageW(WM_CLOSE); //종료
|
||||
}
|
||||
|
||||
void OneCRCDlg::OnBnClickedConnectBt()
|
||||
{
|
||||
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
|
||||
m_pFTPMgr->SetDlg(this);
|
||||
m_pFTPMgr->SetUseData(m_pvecUploadListPath, m_pstrDownPath);
|
||||
m_pFTPMgr->ConnectProcess(m_pstrIP, m_pstrID, m_pstrPW);
|
||||
}
|
||||
|
||||
char* OneCRCDlg::UTF8toANSI(const char* pTxt )
|
||||
{
|
||||
BSTR bstrWide;
|
||||
char* pszAnsi;
|
||||
int nLength;
|
||||
|
||||
nLength = MultiByteToWideChar(CP_UTF8, 0, pTxt, lstrlen((LPCWSTR)pTxt)+1, NULL, NULL);
|
||||
bstrWide = SysAllocStringLen(NULL, nLength);
|
||||
|
||||
MultiByteToWideChar(CP_UTF8, 0, pTxt, lstrlen((LPCWSTR)pTxt)+1, bstrWide,nLength);
|
||||
nLength = WideCharToMultiByte(CP_ACP, 0, bstrWide, -1, NULL, 0, NULL, NULL);
|
||||
pszAnsi = new char[nLength];
|
||||
WideCharToMultiByte(CP_ACP, 0, bstrWide, -1, pszAnsi, nLength, NULL, NULL);
|
||||
SysFreeString(bstrWide);
|
||||
return pszAnsi;
|
||||
}
|
||||
|
||||
void OneCRCDlg::ChangeFontString( TCHAR* pSour, char* pDest )
|
||||
{
|
||||
#if defined(UNICODE) | defined(_UNICODE)
|
||||
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED,
|
||||
pDest, strlen(pDest), pSour, strlen(pDest));
|
||||
#else
|
||||
strcpy(pSour, pDest);
|
||||
#endif
|
||||
}
|
||||
|
||||
void OneCRCDlg::SetConnectInfo( CString* strip, CString* strid, CString* strpw )
|
||||
{
|
||||
m_pstrIP = strip;
|
||||
m_pstrID = strid;
|
||||
m_pstrPW = strpw;
|
||||
}
|
||||
|
||||
void OneCRCDlg::PrintWorkLog( CString* str )
|
||||
{
|
||||
CString strDiv;
|
||||
int iMax = 60;
|
||||
if((*str).GetLength() > iMax)
|
||||
{
|
||||
for(int i = 0 ; i < (*str).GetLength(); ++i)
|
||||
{
|
||||
strDiv += (*str)[i];
|
||||
if(iMax < i)
|
||||
{
|
||||
m_ListBox.AddString(strDiv);
|
||||
strDiv = L"";
|
||||
iMax += iMax; //60개씩 자른다.
|
||||
}
|
||||
}
|
||||
m_ListBox.AddString(strDiv);
|
||||
}
|
||||
else
|
||||
m_ListBox.AddString(*str);
|
||||
m_ListBox.RedrawWindow();
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
#pragma once
|
||||
#include "afxwin.h"
|
||||
#include "afxcmn.h"
|
||||
#include "resource.h"
|
||||
|
||||
#include <vector>
|
||||
typedef std::vector<CString>* pVecString;
|
||||
|
||||
// OneCRCDlg 대화 상자입니다.
|
||||
class CCRCManager;
|
||||
class CFTPManager;
|
||||
class OneCRCDlg : public CDialog
|
||||
{
|
||||
DECLARE_DYNAMIC(OneCRCDlg)
|
||||
public:
|
||||
OneCRCDlg(CWnd* pParent = NULL); // 표준 생성자입니다.
|
||||
virtual ~OneCRCDlg();
|
||||
void PrintWorkLog(CString* str);
|
||||
// 대화 상자 데이터입니다.
|
||||
enum { IDD = IDD_ONECRCDLG };
|
||||
|
||||
protected:
|
||||
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원입니다.
|
||||
|
||||
DECLARE_MESSAGE_MAP()
|
||||
public:
|
||||
afx_msg void OnBnClickedOk();
|
||||
|
||||
//생성한 함수입니다
|
||||
private:
|
||||
enum OBJ_ID { LIST_BOX1 };
|
||||
void InitializationDlg(); //초기화
|
||||
char* UTF8toANSI(const char* pTxt);
|
||||
void ChangeFontString( TCHAR* pSour, char* pDest );
|
||||
CCRCManager* m_pCRCMgr;
|
||||
CFTPManager* m_pFTPMgr;
|
||||
pVecString m_pvecUploadListPath;
|
||||
CString* m_pstrDownPath;
|
||||
CString* m_pstrIP;
|
||||
CString* m_pstrID;
|
||||
CString* m_pstrPW;
|
||||
public:
|
||||
void SetConnectInfo(CString* strip, CString* strid, CString* strpw);
|
||||
void SetUploadListPath(pVecString vecupload) { m_pvecUploadListPath = vecupload; };
|
||||
void SetDownloadPath(CString* strPath) { m_pstrDownPath = strPath; };
|
||||
void SetCRCMgr(CCRCManager* pMgr) { m_pCRCMgr = pMgr; }
|
||||
void SetFTPMgr(CFTPManager* pMgr) { m_pFTPMgr = pMgr; }
|
||||
//CString m_strLog;
|
||||
afx_msg void OnBnClickedConnectBt();
|
||||
CListBox m_ListBox;
|
||||
};
|
||||
@@ -0,0 +1,160 @@
|
||||
|
||||
// OneClickCRC.cpp : 응용 프로그램에 대한 클래스 동작을 정의합니다.
|
||||
//
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "afxwinappex.h"
|
||||
#include "afxdialogex.h"
|
||||
#include "OneClickCRC.h"
|
||||
//#include "MainFrm.h"
|
||||
|
||||
|
||||
#ifdef _DEBUG
|
||||
#define new DEBUG_NEW
|
||||
#endif
|
||||
|
||||
|
||||
//추가한 내용입니다.
|
||||
#include "Manager/CRC/CRCManager.h"
|
||||
#include "Manager/FTP/FTPManager.h"
|
||||
#include "OneCRCDlg.h"
|
||||
|
||||
// COneClickCRCApp
|
||||
|
||||
BEGIN_MESSAGE_MAP(COneClickCRCApp, CWinAppEx)
|
||||
END_MESSAGE_MAP()
|
||||
|
||||
|
||||
// COneClickCRCApp 생성
|
||||
|
||||
COneClickCRCApp::COneClickCRCApp()
|
||||
: m_pCRCMgr(NULL), m_pFTPMgr(NULL)
|
||||
{
|
||||
//m_bHiColorIcons = TRUE;
|
||||
|
||||
// TODO: 아래 응용 프로그램 ID 문자열을 고유 ID 문자열로 바꾸십시오(권장).
|
||||
// 문자열에 대한 서식: CompanyName.ProductName.SubProduct.VersionInformation
|
||||
SetAppID(_T("OneClickCRC.AppID.NoVersion"));
|
||||
|
||||
// TODO: 여기에 생성 코드를 추가합니다.
|
||||
// InitInstance에 모든 중요한 초기화 작업을 배치합니다.
|
||||
}
|
||||
|
||||
// 유일한 COneClickCRCApp 개체입니다.
|
||||
|
||||
COneClickCRCApp theApp;
|
||||
|
||||
|
||||
// COneClickCRCApp 초기화
|
||||
|
||||
BOOL COneClickCRCApp::InitInstance()
|
||||
{
|
||||
CWinAppEx::InitInstance();
|
||||
|
||||
|
||||
// EnableTaskbarInteraction(FALSE);
|
||||
|
||||
// RichEdit 컨트롤을 사용하려면 AfxInitRichEdit2()가 있어야 합니다.
|
||||
// AfxInitRichEdit2();
|
||||
|
||||
// 표준 초기화
|
||||
// 이들 기능을 사용하지 않고 최종 실행 파일의 크기를 줄이려면
|
||||
// 아래에서 필요 없는 특정 초기화
|
||||
// 루틴을 제거해야 합니다.
|
||||
// 해당 설정이 저장된 레지스트리 키를 변경하십시오.
|
||||
// TODO: 이 문자열을 회사 또는 조직의 이름과 같은
|
||||
// 적절한 내용으로 수정해야 합니다.
|
||||
// SetRegistryKey(_T("로컬 응용 프로그램 마법사에서 생성된 응용 프로그램"));
|
||||
//
|
||||
//
|
||||
// InitContextMenuManager();
|
||||
//
|
||||
// InitKeyboardManager();
|
||||
//
|
||||
// InitTooltipManager();
|
||||
// CMFCToolTipInfo ttParams;
|
||||
// ttParams.m_bVislManagerTheme = TRUE;
|
||||
// theApp.GetTooltipManager()->SetTooltipParams(AFX_TOOLTIP_TYPE_ALL,
|
||||
// RUNTIME_CLASS(CMFCToolTipCtrl), &ttParams);
|
||||
|
||||
// 주 창을 만들기 위해 이 코드에서는 새 프레임 창 개체를
|
||||
// 만든 다음 이를 응용 프로그램의 주 창 개체로 설정합니다.
|
||||
// CMainFrame* pFrame = new CMainFrame;
|
||||
// if (!pFrame)
|
||||
// return FALSE;
|
||||
// m_pMainWnd = pFrame;
|
||||
// // 프레임을 만들어 리소스와 함께 로드합니다.
|
||||
// pFrame->LoadFrame(IDR_MAINFRAME,
|
||||
// WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL,
|
||||
// NULL);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// 창 하나만 초기화되었으므로 이를 표시하고 업데이트합니다.
|
||||
// pFrame->ShowWindow(SW_SHOW);
|
||||
// pFrame->UpdateWindow();
|
||||
// 접미사가 있을 경우에만 DragAcceptFiles를 호출합니다.
|
||||
// SDI 응용 프로그램에서는 ProcessShellCommand 후에 이러한 호출이 발생해야 합니다.
|
||||
|
||||
//다이얼로그 설정 부분입니다.
|
||||
OneCRCDlg oneDlg;
|
||||
m_pMainWnd = &oneDlg;
|
||||
m_pCRCMgr = CCRCManager::GetInst();
|
||||
m_pFTPMgr = CFTPManager::GetInst();
|
||||
oneDlg.SetCRCMgr(m_pCRCMgr);
|
||||
oneDlg.SetFTPMgr(m_pFTPMgr);
|
||||
int nResponse = oneDlg.DoModal();
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
int COneClickCRCApp::ExitInstance()
|
||||
{
|
||||
//TODO: 추가한 추가 리소스를 처리합니다.
|
||||
m_pCRCMgr->ReleaseInst();
|
||||
m_pFTPMgr->ReleaseInst();
|
||||
return CWinAppEx::ExitInstance();
|
||||
}
|
||||
|
||||
// COneClickCRCApp 메시지 처리기
|
||||
|
||||
|
||||
// 응용 프로그램 정보에 사용되는 CAboutDlg 대화 상자입니다.
|
||||
|
||||
class CAboutDlg : public CDialogEx
|
||||
{
|
||||
public:
|
||||
CAboutDlg();
|
||||
|
||||
// 대화 상자 데이터입니다.
|
||||
enum { IDD = IDD_ABOUTBOX };
|
||||
|
||||
protected:
|
||||
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원입니다.
|
||||
|
||||
// 구현입니다.
|
||||
protected:
|
||||
DECLARE_MESSAGE_MAP()
|
||||
};
|
||||
|
||||
CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
|
||||
{
|
||||
}
|
||||
|
||||
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
|
||||
{
|
||||
CDialogEx::DoDataExchange(pDX);
|
||||
}
|
||||
|
||||
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
|
||||
END_MESSAGE_MAP()
|
||||
|
||||
// 대화 상자를 실행하기 위한 응용 프로그램 명령입니다.
|
||||
|
||||
// COneClickCRCApp 메시지 처리기
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,40 @@
|
||||
|
||||
// OneClickCRC.h : OneClickCRC 응용 프로그램에 대한 주 헤더 파일
|
||||
//
|
||||
#pragma once
|
||||
|
||||
#ifndef __AFXWIN_H__
|
||||
#error "PCH에 대해 이 파일을 포함하기 전에 'stdafx.h'를 포함합니다."
|
||||
#endif
|
||||
|
||||
#include "resource.h" // 주 기호입니다.
|
||||
|
||||
|
||||
// COneClickCRCApp:
|
||||
// 이 클래스의 구현에 대해서는 OneClickCRC.cpp을 참조하십시오.
|
||||
//
|
||||
class CCRCManager;
|
||||
class CFTPManager;
|
||||
class COneClickCRCApp : public CWinAppEx
|
||||
{
|
||||
public:
|
||||
COneClickCRCApp();
|
||||
|
||||
|
||||
// 재정의입니다.
|
||||
public:
|
||||
virtual BOOL InitInstance();
|
||||
virtual int ExitInstance();
|
||||
|
||||
// 구현입니다.
|
||||
|
||||
public:
|
||||
BOOL m_bHiColorIcons;
|
||||
DECLARE_MESSAGE_MAP()
|
||||
|
||||
private:
|
||||
CCRCManager* m_pCRCMgr;
|
||||
CFTPManager* m_pFTPMgr;
|
||||
};
|
||||
|
||||
extern COneClickCRCApp theApp;
|
||||
Binary file not shown.
@@ -0,0 +1,147 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|Win32">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|Win32">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>Win32</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<ProjectGuid>{EA6A89CB-822A-4C7D-8118-74600D324E96}</ProjectGuid>
|
||||
<RootNamespace>OneClickCRC</RootNamespace>
|
||||
<Keyword>MFCProj</Keyword>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<UseOfMfc>Dynamic</UseOfMfc>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<UseOfMfc>Dynamic</UseOfMfc>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<LinkIncremental>true</LinkIncremental>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
</Link>
|
||||
<Midl>
|
||||
<MkTypLibCompatible>false</MkTypLibCompatible>
|
||||
<ValidateAllParameters>true</ValidateAllParameters>
|
||||
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</Midl>
|
||||
<ResourceCompile>
|
||||
<Culture>0x0412</Culture>
|
||||
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</ResourceCompile>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||
<Optimization>MaxSpeed</Optimization>
|
||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
</Link>
|
||||
<Midl>
|
||||
<MkTypLibCompatible>false</MkTypLibCompatible>
|
||||
<ValidateAllParameters>true</ValidateAllParameters>
|
||||
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
</Midl>
|
||||
<ResourceCompile>
|
||||
<Culture>0x0412</Culture>
|
||||
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</ResourceCompile>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<None Include="ReadMe.txt" />
|
||||
<None Include="res\OneClickCRC.ico" />
|
||||
<None Include="res\OneClickCRC.rc2" />
|
||||
<None Include="res\Toolbar.bmp" />
|
||||
<None Include="res\Toolbar256.bmp" />
|
||||
<None Include="StringChange.txt" />
|
||||
<None Include="UserImages.bmp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="ChildView.h">
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||
</ClInclude>
|
||||
<ClInclude Include="MainFrm.h">
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Manager\CRC\CRCManager.h" />
|
||||
<ClInclude Include="Manager\FTP\FTPManager.h" />
|
||||
<ClInclude Include="OneClickCRC.h" />
|
||||
<ClInclude Include="OneCRCDlg.h" />
|
||||
<ClInclude Include="Resource.h" />
|
||||
<ClInclude Include="stdafx.h" />
|
||||
<ClInclude Include="targetver.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="ChildView.cpp">
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="MainFrm.cpp">
|
||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Manager\CRC\CRCManager.cpp" />
|
||||
<ClCompile Include="Manager\FTP\FTPManager.cpp" />
|
||||
<ClCompile Include="OneClickCRC.cpp" />
|
||||
<ClCompile Include="OneCRCDlg.cpp" />
|
||||
<ClCompile Include="stdafx.cpp">
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
|
||||
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="OneClickCRC.rc" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
<ProjectExtensions>
|
||||
<VisualStudio>
|
||||
<UserProperties RESOURCE_FILE="OneClickCRC.rc" />
|
||||
</VisualStudio>
|
||||
</ProjectExtensions>
|
||||
</Project>
|
||||
@@ -0,0 +1,105 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<Filter Include="소스 파일">
|
||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="헤더 파일">
|
||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="리소스 파일">
|
||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="사용암함">
|
||||
<UniqueIdentifier>{934a2d68-e91a-4f1b-8f70-a91b48ba1385}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="00.Manager">
|
||||
<UniqueIdentifier>{2933e0d6-3c9d-4ebe-af75-c0282c3a0530}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="00.Manager\FTP">
|
||||
<UniqueIdentifier>{db2eed16-dc0e-4f50-92b0-2c9bff176f15}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="00.Manager\CRC">
|
||||
<UniqueIdentifier>{259dc2f5-ea57-4eea-91b9-5f0eff364ea8}</UniqueIdentifier>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="ReadMe.txt" />
|
||||
<None Include="res\Toolbar.bmp">
|
||||
<Filter>사용암함</Filter>
|
||||
</None>
|
||||
<None Include="UserImages.bmp">
|
||||
<Filter>사용암함</Filter>
|
||||
</None>
|
||||
<None Include="res\Toolbar256.bmp">
|
||||
<Filter>사용암함</Filter>
|
||||
</None>
|
||||
<None Include="res\OneClickCRC.ico">
|
||||
<Filter>사용암함</Filter>
|
||||
</None>
|
||||
<None Include="res\OneClickCRC.rc2">
|
||||
<Filter>리소스 파일</Filter>
|
||||
</None>
|
||||
<None Include="StringChange.txt" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="OneClickCRC.h">
|
||||
<Filter>헤더 파일</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="stdafx.h">
|
||||
<Filter>헤더 파일</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="targetver.h">
|
||||
<Filter>헤더 파일</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Resource.h">
|
||||
<Filter>헤더 파일</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="OneCRCDlg.h">
|
||||
<Filter>리소스 파일</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="ChildView.h">
|
||||
<Filter>사용암함</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="MainFrm.h">
|
||||
<Filter>사용암함</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Manager\CRC\CRCManager.h">
|
||||
<Filter>00.Manager\CRC</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Manager\FTP\FTPManager.h">
|
||||
<Filter>00.Manager\FTP</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="OneClickCRC.cpp">
|
||||
<Filter>소스 파일</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="stdafx.cpp">
|
||||
<Filter>소스 파일</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="OneCRCDlg.cpp">
|
||||
<Filter>리소스 파일</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="ChildView.cpp">
|
||||
<Filter>사용암함</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="MainFrm.cpp">
|
||||
<Filter>사용암함</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Manager\CRC\CRCManager.cpp">
|
||||
<Filter>00.Manager\CRC</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Manager\FTP\FTPManager.cpp">
|
||||
<Filter>00.Manager\FTP</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="OneClickCRC.rc">
|
||||
<Filter>사용암함</Filter>
|
||||
</ResourceCompile>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 7.8 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 66 KiB |
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 598 B |
Binary file not shown.
|
After Width: | Height: | Size: 2.9 KiB |
Binary file not shown.
@@ -0,0 +1,8 @@
|
||||
|
||||
// stdafx.cpp : 표준 포함 파일만 들어 있는 소스 파일입니다.
|
||||
// OneClickCRC.pch는 미리 컴파일된 헤더가 됩니다.
|
||||
// stdafx.obj에는 미리 컴파일된 형식 정보가 포함됩니다.
|
||||
|
||||
#include "stdafx.h"
|
||||
|
||||
|
||||
@@ -0,0 +1,74 @@
|
||||
|
||||
// stdafx.h : 자주 사용하지만 자주 변경되지는 않는
|
||||
// 표준 시스템 포함 파일 및 프로젝트 관련 포함 파일이
|
||||
// 들어 있는 포함 파일입니다.
|
||||
|
||||
#pragma once
|
||||
|
||||
#ifndef _SECURE_ATL
|
||||
#define _SECURE_ATL 1
|
||||
#endif
|
||||
|
||||
#ifndef VC_EXTRALEAN
|
||||
#define VC_EXTRALEAN // 거의 사용되지 않는 내용은 Windows 헤더에서 제외합니다.
|
||||
#endif
|
||||
|
||||
#include "targetver.h"
|
||||
|
||||
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 일부 CString 생성자는 명시적으로 선언됩니다.
|
||||
|
||||
// MFC의 공통 부분과 무시 가능한 경고 메시지에 대한 숨기기를 해제합니다.
|
||||
#define _AFX_ALL_WARNINGS
|
||||
|
||||
#include <afxwin.h> // MFC 핵심 및 표준 구성 요소입니다.
|
||||
#include <afxext.h> // MFC 확장입니다.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#ifndef _AFX_NO_OLE_SUPPORT
|
||||
#include <afxdtctl.h> // Internet Explorer 4 공용 컨트롤에 대한 MFC 지원입니다.
|
||||
#endif
|
||||
#ifndef _AFX_NO_AFXCMN_SUPPORT
|
||||
#include <afxcmn.h> // Windows 공용 컨트롤에 대한 MFC 지원입니다.
|
||||
#endif // _AFX_NO_AFXCMN_SUPPORT
|
||||
|
||||
#include <afxcontrolbars.h> // MFC의 리본 및 컨트롤 막대 지원
|
||||
|
||||
|
||||
//추가한 내용입니다.
|
||||
#define MAX_PATH 260
|
||||
#define SAFEDELETE(x) if(x != NULL) { delete x; x = NULL; }
|
||||
#define COMPARE(x,min,max) (((x)>=(min))&&((x)<(max)))
|
||||
#define SAFEDELETE(x) if(x != NULL) { delete x; x = NULL; }
|
||||
|
||||
//글로벌 핸들
|
||||
extern HWND g_hWnd;
|
||||
|
||||
//검사에 사용할 파일입니다.
|
||||
#define CRC_EXE_FILE_NAME "CrcReader.exe"
|
||||
#define CRC_TXT_FILE_NAME "Crc.txt"
|
||||
#define MGAME_TXT_FILE_NAME "start_mgame.txt"
|
||||
#define START_TXT_FILE_NAME "start.txt"
|
||||
#define AUTO_UP_EXE "autoupgrade.exe"
|
||||
#define AUTO_UP_INI "autoupgrade_info.ini"
|
||||
#define AUTO_UP_MGAME "autoupgrade_info_mgame.ini"
|
||||
#define COUNTRY_INFO_INI "Country_Info.ini"
|
||||
|
||||
//인터넷 체크용
|
||||
#include <WinInet.h>
|
||||
#pragma comment(lib, "WinInet.lib")
|
||||
|
||||
//HTML오류
|
||||
#include <mshtml.h>
|
||||
#include <Windows.h>
|
||||
|
||||
//ENUM
|
||||
enum DATE_ID { DI_AUTOEXE, DI_MGAMEINI, DI_AUTOINFO}; //date 목록
|
||||
enum OBJ_ID { LIST_BOX };
|
||||
enum WORK_STEP { WS_CHECKSERVER, WS_LOADINIINFO, WS_GETINIDATA, WS_GETURLDATA
|
||||
,WS_COPYFILEPATH, WS_RUNCRC, WS_CREATE_FILEnFOLDER, WS_PROCESS_COMPLETE
|
||||
, WS_OTHERSTART, WS_OTHERSVRINFO, WS_OTHERWORKSTART};
|
||||
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
#pragma once
|
||||
|
||||
// 포함 SDKDDKVer.h는 사용 가능한 Windows 플랫폼 중 버전이 가장 높은 플랫폼을 정의합니다.
|
||||
|
||||
// 이전 Windows 플랫폼에 대해 응용 프로그램을 빌드하려는 경우에는 SDKDDKVer.h를 포함하기 전에
|
||||
// WinSDKVer.h를 포함하고 _WIN32_WINNT 매크로를 지원하려는 플랫폼으로 설정하십시오.
|
||||
|
||||
#include <SDKDDKVer.h>
|
||||
Reference in new issue
Block a user