strPath.Format("%s\\SP-Console.exe",szPath);// ConsoleUpdater.cpp : ÀÀ¿ë ÇÁ·Î±×·¥¿¡ ´ëÇÑ Å¬·¡½º µ¿ÀÛÀ» Á¤ÀÇÇÕ´Ï´Ù. // #include "stdafx.h" #include "ConsoleUpdater.h" #include "ConsoleUpdaterDlg.h" #include "FileVersionInfo.h" #include "../Common/MyPing.h" #include // MFC socket extensions #include "../Common/RegUtil.h" #import using namespace MSXML2; #ifdef _DEBUG #define new DEBUG_NEW #endif #include // CConsoleUpdaterApp BEGIN_MESSAGE_MAP(CConsoleUpdaterApp, CWinApp) ON_COMMAND(ID_HELP, CWinApp::OnHelp) END_MESSAGE_MAP() // CConsoleUpdaterApp »ý¼º CConsoleUpdaterApp::CConsoleUpdaterApp() { // TODO: ¿©±â¿¡ »ý¼º Äڵ带 Ãß°¡ÇÕ´Ï´Ù. // InitInstance¿¡ ¸ðµç Áß¿äÇÑ ÃʱâÈ­ ÀÛ¾÷À» ¹èÄ¡ÇÕ´Ï´Ù. } // À¯ÀÏÇÑ CConsoleUpdaterApp °³Ã¼ÀÔ´Ï´Ù. CConsoleUpdaterApp theApp; // CConsoleUpdaterApp ÃʱâÈ­ int GetCurrentPath(char* pszPath) { char szPath[MAX_PATH]={0}; char* pData; GetModuleFileName(NULL,szPath,MAX_PATH); pData = strrchr(szPath,'\\'); strncpy(pszPath,szPath,pData-szPath); return int(strlen(pszPath)); } BOOL MyCreateDirectory(CString sDirectory) { CString sPath = ""; int iToken = 0; CString sText = sDirectory.Tokenize("\\", iToken); while (sText != "") { sPath += sText + "\\"; if (sPath.GetLength() > 3 && !CreateDirectory(sPath, NULL)) { DWORD dwError = GetLastError(); if (dwError != ERROR_ALREADY_EXISTS) { SetLastError(dwError); return false; } } sText = sDirectory.Tokenize("\\", iToken); if(iToken<0) break; } return true; } BOOL CConsoleUpdaterApp::CheckServer() { CMyPing p; BOOL bRet = TRUE; bRet = p.Ping2(1, DOWN_HOST); if (!bRet) { MessageBox(NULL,"¼­¹ö¿¡ ¿¬°áÇÒ¼ö ¾ø½À´Ï´Ù. ³×Æ®¿÷ ¿¬°á»óŸ¦ È®ÀÎÇϼ¼¿ä","SP-Console ¾÷µ¥ÀÌÅÍ",MB_OK); return TRUE; } return TRUE; } BOOL CConsoleUpdaterApp::InitInstance() { HANDLE hMutex = ::CreateMutex(NULL, TRUE, _T("SP-UpdaterXXXXXXXXXXXXXXX")); if (!hMutex && ::GetLastError() == ERROR_ALREADY_EXISTS) { CloseHandle(hMutex); return FALSE; } // ÀÀ¿ë ÇÁ·Î±×·¥ ¸Å´ÏÆä½ºÆ®°¡ ComCtl32.dll ¹öÀü 6 ÀÌ»óÀ» »ç¿ëÇÏ¿© ºñÁÖ¾ó ½ºÅ¸ÀÏÀ» // »ç¿ëÇϵµ·Ï ÁöÁ¤ÇÏ´Â °æ¿ì, Windows XP »ó¿¡¼­ ¹Ýµå½Ã InitCommonControls()°¡ ÇÊ¿äÇÕ´Ï´Ù. // InitCommonControls()¸¦ »ç¿ëÇÏÁö ¾ÊÀ¸¸é âÀ» ¸¸µé ¼ö ¾ø½À´Ï´Ù. InitCommonControls(); CWinApp::InitInstance(); AfxEnableControlContainer(); if (CheckServer() == FALSE) return FALSE; CStringArray saFile; GetUpdateFileList(saFile); CString sUpdater="2"; if (saFile.GetCount() > 0) { CConsoleUpdaterDlg dlg; dlg.SetFileList(saFile); if (dlg.DoModal() != IDOK) return FALSE; sUpdater = dlg.m_bIsSelfUpdate? "1":"0"; } char szPath[MAX_PATH]={0}; CString strPath; GetCurrentPath(szPath); #ifdef _OPENDISK strPath.Format("%s\\OD-Console.exe",szPath); #else strPath.Format("%s\\SP-Console.exe",szPath); #endif ShellExecute(NULL, NULL, strPath, sUpdater, NULL, SW_SHOW); CloseHandle(hMutex); // ´ëÈ­ »óÀÚ°¡ ´ÝÇûÀ¸¹Ç·Î ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ ¸Þ½ÃÁö ÆßÇÁ¸¦ ½ÃÀÛÇÏÁö ¾Ê°í // ÀÀ¿ë ÇÁ·Î±×·¥À» ³¡³¾ ¼ö ÀÖµµ·Ï FALSE¸¦ ¹ÝȯÇÕ´Ï´Ù. return FALSE; } CStringArray& VersionSplit(CString string, CStringArray& array) { while (string.GetLength() > 0) { int Pos = string.Find("."); if (Pos != -1) { array.Add(string.Left(Pos)); string = string.Mid(Pos + 1); } else { array.Add(string); string = ""; } } return array; } BOOL CConsoleUpdaterApp::CheckUpdate(CString &strLocal, CString &strRemote) { CStringArray localver, remotver; VersionSplit(strLocal, localver); VersionSplit(strRemote, remotver); // ¹öÀü Çü½ÄÀÌ ¸ÂÁö ¾ÊÀ¸¸é ¾÷µ¥ÀÌÆ® ¼­¹ö ¿ì¼± ½Ã ÇÔ if( localver.GetCount() != remotver.GetCount() ) return TRUE; // ¹öÀü ´ÜÀ§ üũ for (int i = 0; i < remotver.GetCount(); ++i) { if( atoi( localver[i] ) < atoi( remotver[i] ) ) return TRUE; } return FALSE; } void CConsoleUpdaterApp::GetUpdateFileList(CStringArray& saFile) { CString strPath; CString sURL = DOWN_URL; CString sFileName; CString strTemp; CString LocalVersion; CString RemotVersion; CString strLocalFile; int nIndex=1; char szBuffer[MAX_PATH]={0}; char szPath[MAX_PATH]={0}; DWORD dwRet; CFileVersionInfo FileInfo; char szVersion[20]={0}; if(GetCurrentPath(szPath) >0) { strPath.Format("%s\\update\\",szPath); MyCreateDirectory(strPath); } else return; strPath += "update.ini"; if (URLDownloadToFile(NULL, sURL + "/update.ini", strPath, 0, NULL) != S_OK) return; do { strTemp.Format("%d",nIndex); dwRet = GetPrivateProfileString("FILES",strTemp,NULL,szBuffer,sizeof(szBuffer),strPath); if (dwRet) { strLocalFile.Format("%s\\%s",szPath,szBuffer); FileInfo.Create(strLocalFile); LocalVersion = FileInfo.GetFileVersion(); GetPrivateProfileString(szBuffer,"Version",NULL,szVersion,sizeof(szVersion),strPath); RemotVersion = szVersion; if(CheckUpdate(LocalVersion, RemotVersion)) saFile.Add(strLocalFile); } nIndex ++; }while(dwRet); return; } CString GetErrorMessage(DWORD dwError) { CString sError; LPVOID lpBuffer; if (!FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpBuffer, 0, NULL)) sError = "¾Ë ¼ö ¾ø´Â ¿À·ùÀÔ´Ï´Ù."; else sError = (LPCTSTR)lpBuffer; LocalFree(lpBuffer); return sError; }