LosaDev source snapshot 2019

This commit is contained in:
LosaDev committed 2026-11-07 13:30:45 +07:00
commit c198676e97
20588 files changed
+8812878

No files matched your search

+20
View File
@@ -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()를 호출하지 마십시오.
}
+36
View File
@@ -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()
};
+175
View File
@@ -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;
}
+50
View File
@@ -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;
};
+142
View File
@@ -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();
}
+51
View File
@@ -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.
+8
View File
@@ -0,0 +1,8 @@
// stdafx.cpp : 표준 포함 파일만 들어 있는 소스 파일입니다.
// OneClickCRC.pch는 미리 컴파일된 헤더가 됩니다.
// stdafx.obj에는 미리 컴파일된 형식 정보가 포함됩니다.
#include "stdafx.h"
+74
View File
@@ -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>