www.pudn.com > WZ_UpdateModule_DLL.rar > Update.cpp


 
#include "WZ_UM.h" 
#include "ReadScript.h" 
#include "resource.h" 
#include "UpdateDefine.h" 
#include "Tlhelp32.h" 
 
#include ".\wz_um.h" 
 
 
/////////////////////////////////////////////////////////////////////////////////////// 
/* 
	±âº» ¾÷µ¥ÀÌÆ® Ŭ·¡½º : ÀÌ Å¬·¡½º¿¡¼­ FTP ¿Í HTTP ¾÷µ¥ÀÌÆ® Ŭ·¡½º°¡ »ó¼Ó ¹Þ´Â´Ù. 
*/ 
 
WZ_DECLAREDLL CWZUpdateModule::CWZUpdateModule() 
{ 
	InitializeCriticalSection (& m_critERROR_MSG); 
 
	memset (m_szIPADDR, '\0', sizeof(m_szIPADDR)); 
	m_wPORT = 0; 
	memset (m_szID, '\0', sizeof(m_szID)); 
	memset (m_szPASS, '\0', sizeof(m_szPASS)); 
	m_lpFN_EventCallbackProc = NULL; 
	m_iCurrentState = STATE_DISCONNECTED; 
	m_bCancelUpdate = FALSE; 
	m_uUpdateFolderCount = 0; 
	m_strtUpdatingFileInfo.lpszErrorMsg = m_szLastErrorMsg; 
	m_bUseEventProc = FALSE; 
	m_nUpdateThreadID = 0; 
	m_bLoadUpdateInfo = FALSE; 
	m_nServerNumber = 0; 
} 
 
 
WZ_DECLAREDLL CWZUpdateModule::CWZUpdateModule (LPSTR lpszIPADDR, WORD wPORT, LPSTR lpszID, LPSTR lpszPASS) 
{ 
	InitializeCriticalSection (& m_critERROR_MSG); 
 
	strcpy (m_szIPADDR, lpszIPADDR); 
	m_wPORT = wPORT; 
	strcpy (m_szID, lpszID); 
	strcpy (m_szPASS, lpszPASS); 
	m_lpFN_EventCallbackProc = NULL; 
	m_iCurrentState = STATE_DISCONNECTED; 
	m_bCancelUpdate = FALSE; 
	m_uUpdateFolderCount = 0; 
	m_strtUpdatingFileInfo.lpszErrorMsg = m_szLastErrorMsg; 
	m_bUseEventProc = FALSE; 
	m_nUpdateThreadID = 0; 
	m_bLoadUpdateInfo = FALSE; 
	m_nServerNumber = 0; 
} 
 
 
WZ_DECLAREDLL CWZUpdateModule::~CWZUpdateModule() 
{ 
	DeleteCriticalSection(&m_critERROR_MSG); 
} 
 
 
WZ_DECLAREDLL VOID CWZUpdateModule::SetLastErrorMsg (INT iERROR_MODE, INT iERROR_CODE, LPSTR szUSER_MSG) 
{ 
	EnterCriticalSection (& m_critERROR_MSG); 
 
	DWORD dwERROR_CODE = iERROR_CODE; 
	DWORD dwBUFFER_LEN = sizeof(m_szLastErrorMsg); 
 
	switch (iERROR_MODE) 
	{ 
	case CWZUpdateModule::ERROR_SYSTEM : 
		if (iERROR_CODE >= 12000) 
			InternetGetLastResponseInfo (&dwERROR_CODE, m_szLastErrorMsg, &dwBUFFER_LEN); 
		else 
			FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM, NULL, iERROR_CODE, 0, m_szLastErrorMsg, sizeof (m_szLastErrorMsg), NULL); 
 
		m_iLastErrorMode = CWZUpdateModule::ERROR_SYSTEM; 
		m_strtUpdatingFileInfo.iErrorCode = iERROR_CODE; 
		break; 
	case CWZUpdateModule::ERROR_USER : 
		strcpy (m_szLastErrorMsg, szUSER_MSG); 
		m_iLastErrorMode = CWZUpdateModule::ERROR_USER; 
		m_strtUpdatingFileInfo.iErrorCode = 0; 
		break; 
	default : 
		m_szLastErrorMsg[0] = '\0'; 
		m_iLastErrorMode = CWZUpdateModule::ERROR_NONE; 
		m_strtUpdatingFileInfo.iErrorCode = 0; 
		break; 
	} 
 
	AddEvent( EVENT_ERROR ); 
 
	LeaveCriticalSection (& m_critERROR_MSG); 
} 
 
 
WZ_DECLAREDLL const LPSTR CWZUpdateModule::GetLastErrorMsg() 
{ 
	return m_szLastErrorMsg; 
} 
 
 
WZ_DECLAREDLL const INT CWZUpdateModule::GetLastErrorCode() 
{ 
	return m_iLastErrorCode; 
} 
 
 
WZ_DECLAREDLL unsigned __stdcall CWZUpdateModule::UpdateWorkerThread (LPVOID lpParam) 
{ 
	CWZUpdateModule * lpWZUM = (CWZUpdateModule *) lpParam; 
 
	if ( lpWZUM->UpdateRun() == TRUE ) 
		lpWZUM->AddEvent( EVENT_UPDATE_END_SUCCESS ); 
	else 
		lpWZUM->AddEvent( EVENT_UPDATE_END_FAIL ); 
	 
	return 0; 
} 
 
 
WZ_DECLAREDLL BOOL CWZUpdateModule::LoadLocalVerInfo() 
{ 
	if( IsUpdateInfoLoad() ) 
	{ 
		byte byVer[3]; 
		GetVersionFromString( m_info.m_szServerVer[m_nServerNumber], byVer[0], byVer[1], byVer[2] ); 
		m_btLocalVer1 = byVer[0]; 
		m_btLocalVer2 = byVer[1]; 
		m_btLocalVer3 = byVer[2]; 
		m_uLocalTotalVersion = GetTotalVersion( m_btLocalVer1, m_btLocalVer2, m_btLocalVer3 ); 
	} 
	else 
		return FALSE; 
 
	return TRUE; 
} 
 
 
WZ_DECLAREDLL BOOL CWZUpdateModule::SaveLocalVerInfo() 
{ 
	return m_info.SaveVersionInfo( m_btLocalVer1, m_btLocalVer2, m_btLocalVer3, m_nServerNumber ); 
} 
 
 
WZ_DECLAREDLL BOOL CWZUpdateModule::CheckVersion(LPSTR lpszFilePath) 
{ 
	if ( (!lpszFilePath) || (!strcmp(lpszFilePath, ""))) 
		return FALSE; 
 
	m_uUpdateFolderCount = 0; 
 
	SMDToken Token; 
	 
	__try 
	{ 
		if( (SMDFile = fopen(m_szVersionFileName, "r")) == NULL ) 
			return FALSE; 
		 
		while(TRUE) 
		{ 
			Token = (*GetToken)(); 
			if( Token == END ) 
				break; 
 
			if( Token == NAME )  
			{ 
				strcpy(m_strtUpdateFolderInfo[m_uUpdateFolderCount].m_szFolderName, TokenString); 
 
				byte byVer[3]; 
				GetVersionFromString( TokenString, byVer[0], byVer[1], byVer[2] ); 
 
				m_strtUpdateFolderInfo[m_uUpdateFolderCount].m_btVer1 = byVer[0]; 
				m_strtUpdateFolderInfo[m_uUpdateFolderCount].m_btVer2 = byVer[1]; 
				m_strtUpdateFolderInfo[m_uUpdateFolderCount].m_btVer3 = byVer[2]; 
				m_strtUpdateFolderInfo[m_uUpdateFolderCount].m_uTotalVersion = GetTotalVersion( byVer[0], byVer[1], byVer[2] ); 
 
				//»õ·Î¿î ¹öÀüÀÌ ÇöÀç ·ÎÄÃÀÇ ¹öÀüº¸´Ù Å©´Ù¸é.. ¾÷µ¥ÀÌÆ®ÇÒ Æú´õÀÇ °³¼ö¸¦ Áõ°¡½ÃŲ´Ù. 
				if (m_strtUpdateFolderInfo[m_uUpdateFolderCount].m_uTotalVersion > m_uLocalTotalVersion) 
					m_uUpdateFolderCount++; 
 
				if( m_uUpdateFolderCount > MAX_FOLDERINFO-1 ) 
					return FALSE; 
			} 
		} 
	} 
	__finally  
	{ 
		if (SMDFile) 
			fclose(SMDFile); 
 
		CHAR szVERFILE_NAME [MAX_PATH], szVERFILE_EXE [MAX_PATH], szVERFILE_FULLNAME [MAX_PATH]; 
		_splitpath (lpszFilePath, NULL, NULL, szVERFILE_NAME, szVERFILE_EXE); 
		wsprintf(szVERFILE_FULLNAME, "%s%s", szVERFILE_NAME, szVERFILE_EXE); 
		DeleteFile (szVERFILE_FULLNAME); 
	} 
 
	return TRUE; 
} 
 
 
// ÀÌ ÇÔ¼ö´Â ¼­¹öÀÇ ¹öÀüÆÄÀÏÀ» ´Ù¿î ¹Þ¾Æ¼­, ÇöÀç Ŭ¶óÀ̾ðÆ®ÀÇ ¹öÀü°ú ºñ±³ÇÏ¿©, 
// ¾÷µ¥ÀÌÆ®¸¦ ÇÒÁö ¾È ÇÒÁö¸¦ °áÁ¤ÇÏ´Â ÇÔ¼ö´Ù. 
// ¹öÀüüũ ½ÇÆÐ¸é, RESULT_FAIL 
// ¾÷µ¥ÀÌÆ® ÆÄÀÏÀÌ ¾øÀ¸¸é, RESULT_NOMORE_UPDATE_FILES 
// ¼º°øÀ̸é, RESULT_SUCCESS 
WZ_DECLAREDLL eRESULT_CONSTANT CWZUpdateModule::CheckUpdateFiles() 
{ 
	// 1 . ¼­¹ö¿¡ ÀÖ´Â ¹öÀü ÆÄÀÏÀ» ´Ù¿î ¹Þ´Â´Ù. 
	// ÇöÀç ´Ù¿î¹ÞÀ»·Á´Â ¼­¹öÀÇ Æú´õ¿¡ ÀÖ´Â ¹öÀü ÆÄÀÏÀ» ´Ù¿î ¹Þ´Â´Ù. ¹ÞÀº ÆÄÀÏÀº ·ÎÄÿ¡ ´Ù¿î¹Þ´Â´Ù. 
	TCHAR szVerFilePath[MAX_PATH]; 
	GetVersionFilePath( szVerFilePath, MAX_PATH ); 
	if ( !DownloadFile( szVerFilePath ) ) 
		return RESULT_FAIL; 
	 
	// 2 . ¹ÞÀº ¹öÀü ÆÄÀÏ¿¡¼­ ÇöÀç Ŭ¶óÀ̾ðÆ®ÀÇ ¹öÀü°ú ºñ±³ÇÏ¿© ¹ÞÀ» ÆÄÀÏÀÌ ÀÖÀ¸¸é ÇØ´ç Æú´õ¿¡¼­ ¸ñ·ÏÆÄÀÏÀ» ¹Þ´Â´Ù. 
	if ( !CheckVersion(m_szVersionFileName) ) 
	{ 
		MessageBox (HWND_DESKTOP, "checking version file error", "error", MB_OK | MB_ICONERROR); 
		return RESULT_FAIL; 
	} 
 
	if (m_uUpdateFolderCount == 0)  //¾÷µ¥ÀÌÆ® ÇÒ ÆÄÀÏÀÌ ¾ø´Ù. 
		return RESULT_NOMORE_UPDATE_FILES; 
 
	return RESULT_SUCCESS; 
} 
 
 
// lpszFilePath´Â ¸®½ºÆ® ÆÄÀÏÀÇ À̸§ÀÌ´Ù. ±âº»ÀûÀ¸·Î wz_filelist.dat ÀÌ´Ù. 
WZ_DECLAREDLL BOOL CWZUpdateModule::UpdateRun() 
{ 
	CHAR szCurrentLocalDirectory [MAX_PATH];						// ÇöÀç ·ÎÄà ȣ½ºÆ®ÀÇ µð·ºÅ丮 °æ·Î 
	CHAR szCurrentLocalFilePath [MAX_PATH]={0,};					// ·ÎÄà ȣ½ºÆ®ÀÇ µð·ºÅ丮 °æ·Î 
 
	CHAR szErrorMsg[256] = {0,};									// ¿¡·¯ ¸Þ½ÃÁö Ãâ·Â¿ë 
 
	m_strtUpdatingFileInfo.Reset(); 
 
	// ÇöÀç ½ÇÇàÆÄÀÏÀÇ µð·ºÅ丮¸¦ ±¸ÇÑ´Ù. 
	GetModuleDirectory( szCurrentLocalDirectory, MAX_PATH ); 
 
	// ¾÷µ¥ÀÌÆ® Àü¿¡ ÇöÀçÀÇ ·ÎÄà ¹öÀüÀ» ¾Ë¸°´Ù. 
	LoadLocalVerInfo(); 
	m_strtUpdatingFileInfo.btVer1 = m_btLocalVer1;  
	m_strtUpdatingFileInfo.btVer2 = m_btLocalVer2;  
	m_strtUpdatingFileInfo.btVer3 = m_btLocalVer3;  
	AddEvent( EVNET_VERSION_ALARM ); 
 
	for (UINT i = 0 ; i < m_uUpdateFolderCount ; i++ ) 
	{ 
		//ÆÄÀϸ®½ºÆ® ÆÄÀÏÀÇ °æ·Î¸¦ ¾ò¾î¿Â´Ù. 
		CHAR szFileListFilePath[MAX_PATH];	 
		GetFileListFilePath( szFileListFilePath, MAX_PATH, m_strtUpdateFolderInfo[i].m_szFolderName ); 
 
		//¸®½ºÆ® ÆÄÀÏ ´Ù¿î·Îµå, ´Ù¿î¹ÞÀ» À§Ä¡¸¦ ÁöÁ¤ÇÏÁö ¾ÊÀ¸¸é ½ÇÇàÆÄÀÏÀÌ ÀÖ´Â °÷¿¡ ´Ù¿î·Îµå ÇÑ´Ù. 
		if ( !DownloadFile(szFileListFilePath) ) 
			return FALSE; 
		 
		char szVerFolerPath[MAX_PATH];	 
		GetVersionFolderPath( szVerFolerPath, MAX_PATH, m_strtUpdateFolderInfo[i].m_szFolderName ); 
		 
		__try 
		{ 
			BOOL bRet = DownloadFilesOnFileList( szVerFolerPath ); 
			if( bRet == FALSE) 
				return FALSE;   //Çϳª¸¸ Àß ¸øµÇµµ, ÇÁ·Î±×·¥À» Á¾·áÇÑ´Ù. 
 
			// ¿©±â±îÁö ¿ÔÀ¸¸é À­ ¹öÀüÀ¸·ÎÀÇ ¾÷µ¥ÀÌÆ®°¡ ¼º°øÇÑ °ÍÀ̹ǷΠ¾÷µÈ ¹öÀü ÀúÀå 
			m_btLocalVer1 = m_strtUpdateFolderInfo[i].m_btVer1; 
			m_btLocalVer2 = m_strtUpdateFolderInfo[i].m_btVer2; 
			m_btLocalVer3 = m_strtUpdateFolderInfo[i].m_btVer3; 
			SaveLocalVerInfo();				 
 
			// ¾÷µ¥ÀÌÆ® Áß ÇÁ·Î±×·¥ ¹öÀüÀ» ¾Ë¸°´Ù. 
			m_strtUpdatingFileInfo.btVer1 = m_btLocalVer1;  
			m_strtUpdatingFileInfo.btVer2 = m_btLocalVer2;  
			m_strtUpdatingFileInfo.btVer3 = m_btLocalVer3;  
			AddEvent( EVNET_VERSION_ALARM ); 
 
			////////////////////////////////////////////////////////////////////////// 
		} 
		__finally  
		{ 
			if (SMDFile) 
				fclose(SMDFile); 
 
			DeleteFile( DEFAULT_FILELIST_FILE ); 
			DeleteFile( m_szVersionFileName ); 
			m_iCurrentState = STATE_CONNECTED; 
		} 
	} 
 
	return TRUE; 
} 
 
 
WZ_DECLAREDLL BOOL CWZUpdateModule::AddEvent(int nEvent) 
{ 
	// ÇöÀç »óŰ¡ DISCONNECTED»óÅÂÀ̸é ÄݹéÇÔ¼ö¸¦ È£ÃâÇÏÁö ¾Ê´Â´Ù. 
	BOOL bRet = FALSE; 
	if ( m_lpFN_EventCallbackProc != NULL && m_bUseEventProc != FALSE )			 
	{ 
		m_lpFN_EventCallbackProc( nEvent, (LPVOID) this, m_strtUpdatingFileInfo); 
		bRet = TRUE; 
	}	 
 
	return bRet; 
} 
 
WZ_DECLAREDLL BOOL CWZUpdateModule::UpdateStop() 
{ 
	//¾÷µ¥ÀÌÆ® ÁßÀ̶ó´Â°Ç ÇöÀç ´Ù¿î·Îµå ¾²·¹µå°¡ µ¹°í ÀÖ´Ù´Â ¶æÀÌ´Ù. 
	m_bCancelUpdate = TRUE; 
	m_bUseEventProc = FALSE; 
 
	WaitForSingleObject( m_hUpdateThread, 1000 ); 
 
	m_bUseEventProc = TRUE; 
	AddEvent( EVENT_FILEDOWNLOAD_STOP ); 
	return TRUE;	 
} 
 
WZ_DECLAREDLL BOOL CWZUpdateModule::SetEventCallBackProc (LPFUNC_RECEIVEEVENT lpFN_EventCallbackFunc ) 
{ 
	if( lpFN_EventCallbackFunc == NULL) 
		return FALSE; 
 
	m_lpFN_EventCallbackProc = lpFN_EventCallbackFunc; 
 
	return TRUE; 
} 
 
WZ_DECLAREDLL void CWZUpdateModule::SetUseEventProc ( BOOL bUse ) 
{ 
	m_bUseEventProc = bUse; 
} 
 
// 01.02.03 °ú °°Àº ¹®ÀÚ¿­¿¡¼­ °¢°¢ÀÇ ¹öÀüÀ» »Ì¾Æ³»´Â ÇÔ¼ö. 
WZ_DECLAREDLL void CWZUpdateModule::GetVersionFromString( char* pszVersion, byte& byVer1, byte& byVer2, byte& byVer3 ) 
{ 
//	char* szTok; 
	string strVersion = pszVersion; 
	int nCnt = 0; 
	byte byVersion[3]; 
 
	while( strVersion.size() != 0) 
	{ 
		int nIdx = strVersion.find('.'); 
		if( nIdx == string::npos ) 
		{ 
			if( !strVersion.empty() ) 
			{ 
				byVersion[nCnt] = atoi( strVersion.c_str() ); 
			} 
 
			strVersion.clear(); 
		} 
		else 
		{ 
			string strVer = strVersion.substr( 0, nIdx ); 
			byVersion[nCnt] = atoi( strVer.c_str() ); 
			strVersion.erase( 0, nIdx + 1); 
			nCnt++; 
		} 
	} 
 
	//¸®Åϰª ´ëÀÔ. 
	byVer1= byVersion[0]; 
	byVer2= byVersion[1]; 
	byVer3= byVersion[2]; 
} 
 
//°¢ ¹öÀüÀÇ À¯ÀÏÇÑ °ªÀ» °°±âÀ§ÇÑ ÅäÅ» ¹öÀü °è»ê.. 
WZ_DECLAREDLL unsigned int CWZUpdateModule::GetTotalVersion( const byte byVer1, const byte byVer2, const byte byVer3 ) 
{ 
	return (byVer1*65536)+(byVer2*256)+byVer3; 
} 
 
//ÀÌ ÇÔ¼ö´Â AutoUpdater¿¡¼­ È£ÃâµÈ´Ù. 
//StartUpdate 
//¹öÀüÆÄÀÏÀ» ´Ù¿î¹Þ¾Æ ¹öÀüÀ» Ã¼Å©ÇØ¼­ ¾÷µ¥ÀÌÆ® ÇÒ ¹öÀüÀÌ ÀÖÀ¸¸é, 
//¾÷µ¥ÀÌÆ® thread¸¦ µ¹·Á¼­, ÆÄÀÏÀ» ´Ù¿î·Îµå ÇÑ´Ù. 
WZ_DECLAREDLL BOOL CWZUpdateModule::StartUpdate() 
{ 
	// ÇöÀç »ì¾Æ Àִ Ŭ¶óÀÌ¾ðÆ® ÇÁ·Î¼¼¼­°¡ ÀÖ´ÂÁö ¾ø´ÂÁö üũÇÑ´Ù. 
	BOOL bRet = CheckLiveProcess();  
	if(bRet == TRUE) //ÇÁ·Î¼¼¼­°¡ »ì¾Æ ÀÖÀ¸¸é..  
	{ 
		AddEvent( EVENT_LIVE_PROCESS ); 
		return FALSE; 
	} 
 
	// ¹öÀüüũ¸¦ ÇÑ´Ù. 
	eRESULT_CONSTANT eRC = CheckUpdateFiles(); 
 
	if ( eRC == RESULT_FAIL ) 
		return FALSE; 
	else if( eRC == RESULT_NOMORE_UPDATE_FILES ) 
	{ 
		// ´õ ÀÌ»ó ¾øµ¥ÀÌÆ® ÇÒ ¼ö ¾øÀ¸¸é, ÇöÀç ¹öÀüÁ¤º¸´Â 0 ¹ø ¹è¿­¿¡ ÀÖ´Ù.. 
		m_strtUpdatingFileInfo.btVer1 = m_strtUpdateFolderInfo[0].m_btVer1; 
		m_strtUpdatingFileInfo.btVer2 = m_strtUpdateFolderInfo[0].m_btVer2; 
		m_strtUpdatingFileInfo.btVer3 = m_strtUpdateFolderInfo[0].m_btVer3; 
		AddEvent( EVENT_NOMORE_UPDATEFILE ); 
		return FALSE; 
	} 
 
	m_iCurrentState = STATE_FILE_DOWNLOADING; 
 
	//Update Thread °¡µ¿ 
	m_nUpdateThreadID = 1; 
	m_hUpdateThread = (HANDLE) _beginthreadex (NULL, NULL, UpdateWorkerThread, (LPVOID) this, 0, &m_nUpdateThreadID); 
	if (m_hUpdateThread == INVALID_HANDLE_VALUE) 
	{ 
		if (m_lpFN_EventCallbackProc) 
		{ 
			SetLastErrorMsg(CWZUpdateModule::ERROR_SYSTEM, GetLastError()); 
			return FALSE; 
		} 
	} 
 
	return TRUE;	// ¸¸ÀÏ FALSE¶ó¸é ¾÷µ¥ÀÌÆ® ÇÁ·Î¼¼½º Á¾·á 
} 
 
//±âº»ÀûÀ¸·Î Á¤ÀÇ µÇ¾î ÀÖ´Â ±âº»°ªÀ» ¼³Á¤ÇÑ´Ù. 
WZ_DECLAREDLL void CWZUpdateModule::SetDefaultData(void) 
{ 
	if( IsUpdateInfoLoad() ) 
		strcpy (m_szVersionFileName, m_info.m_szFTP_VersionFileName ); 
	else 
		strcpy (m_szVersionFileName, DEFAULT_VERSION_FILE); 
} 
 
		 
WZ_DECLAREDLL void CWZUpdateModule::SetVersionFile(const char* pszFile) 
{ 
	strcpy(m_szVersionFileName, pszFile); 
} 
 
 
WZ_DECLAREDLL void	CWZUpdateModule::SetDownloadDirectory(const char* pszDirectory) 
{ 
	if(pszDirectory == NULL || (strcmp(pszDirectory, "") == 0) ) 
		m_strDownDirectory = ""; 
	else 
		m_strDownDirectory = pszDirectory; 
} 
 
 
WZ_DECLAREDLL const string	CWZUpdateModule::GetDownloadDirectory() 
{ 
	return m_strDownDirectory; 
} 
 
//·ÎÄÃÀÇ ´Ù¿î·Îµå Àý´ë °æ·Î¸¦ ¾ò´Â´Ù. 
WZ_DECLAREDLL void	CWZUpdateModule::GetLocalDownAbsoluteDir(string strRelativeDir, string& strAbsolteDir) 
{ 
	if( strRelativeDir.length() == 0 ) 
		strRelativeDir = "\\"; 
 
	//¸¸ÀÏ m_strDownDirectory °¡ null ÀÌ µé¾î ÀÖÀ»¼ö ÀÖ´Ù.. µû¶ó¼­ ±×¶§´Â..  
	//ÇöÀç ½ÇÇàÁßÀÎ µð·ºÅ丮·Î ¼³Á¤ÇÑ´Ù. 
 
	// ´Ù¿î·Îµå µð·ºÅ丮¿¡ strRelativeDir(»ó´ë°æ·Î)¸¦ µ¡ºÙ¿©¼­ ÀúÀå½Ãų ÇöÀç ·ÎÄÃÀÇ Àý´ë°æ·Î¸¦ ¾ò´Â´Ù. 
	if(m_strDownDirectory.length() == 0) 
	{ 
		char szDir[MAX_PATH]; 
		GetModuleDirectory( szDir, MAX_PATH ); 
		strAbsolteDir = szDir; 
		strAbsolteDir += strRelativeDir; 
	} 
	else 
	{ 
		strAbsolteDir = m_strDownDirectory; 
		strAbsolteDir += "\\"; 
		strAbsolteDir += m_info.m_szServerName[m_nServerNumber]; 
		strAbsolteDir += strRelativeDir; 
	} 
} 
 
 
//ÇöÀç ÄÄÇ»ÅÍ¿¡ ¾÷µ¥ÀÌÆ®Çϰí ÀÖ´Â ÇÁ·Î±×·¥ÀÌ ½ÇÇàÁßÀÎÁö üũ. 
//½ÇÇàÁßÀÎ ÇÁ·Î±×·¥ÀÌ Çϳª¶óµµ ÀÖÀ¸¸é TRUE¸®ÅÏ 
//¾Æ´Ï¸é FASLE¸¦ ¸®ÅÏ.. 
WZ_DECLAREDLL BOOL	CWZUpdateModule::CheckLiveProcess() 
{ 
	//ÇÁ·Î¼¼¼­ÀÇ MAX°ªÀº 0-9±îÁö 10°³ÀÌ´Ù. 
	for(int i = 0; i < MAX_LIVE_PROCESS; i++) 
	{ 
		// ÇÁ·Î¼¼½º üũ ·±Ãijª °ÔÀÓ Å¬¶óÀÌ¾ðÆ®°¡ ½ÇÇàÁßÀÎÁö üũÇÑ´Ù 
		HANDLE	hSnapShot; 
 
		//Get the snapshot of the system 
		hSnapShot = CreateToolhelp32Snapshot (TH32CS_SNAPALL, NULL); 
 
		PROCESSENTRY32 pEntry; 
		pEntry.dwSize = sizeof(pEntry); 
 
		//Get first process 
		Process32First (hSnapShot,&pEntry); 
 
		//Iterate thru all processes 
		DWORD dwPID = GetCurrentProcessId(); 
 
		while(TRUE) 
		{ 
			BOOL hRes = Process32Next (hSnapShot,&pEntry); 
			if(hRes == FALSE) 
				break; 
 
			if(dwPID == pEntry.th32ProcessID) 
				continue; 
 
			// ½ÇÇà ÁßÀÎÁö üũÇϵµ·Ï ÇÑ´Ù. 
			if( strcmp(pEntry.szExeFile, m_info.m_szProcess[i] ) == 0 )  //ÇöÀç °°Àº ÇÁ·Î±×·¥ÀÌ ½ÇÇàÁßÀ̶ó¸é.. 
			{ 
				return TRUE; 
			} 
 
		}// End While 
 
	}// End For 
 
	return FALSE; 
} 
 
 
WZ_DECLAREDLL void	CWZUpdateModule::GetModuleDirectory( char* szDirPath, int nSize ) 
{ 
	ZeroMemory( szDirPath, nSize ); 
	char szPath[128]; 
	char szDrive[40], szDir[256]; 
	GetModuleFileName( NULL, szPath, 128); 
	_splitpath( szPath, szDrive, szDir, NULL, NULL ); 
	sprintf( szDirPath, "%s%s", szDrive, szDir); 
} 
 
 
WZ_DECLAREDLL BOOL	CWZUpdateModule::Init(  ) 
{ 
	//·Î±×µ¥ÀÌÅÍ ÃʱâÈ­. 
	char szDir[MAX_PATH]; 
	GetModuleDirectory( szDir, MAX_PATH ); 
 
	BOOL bRet = m_info.LoadData(); 
	if( bRet == TRUE) 
	{ 
		m_bLoadUpdateInfo = TRUE; 
		strncpy( m_szIPADDR, m_info.m_szFTP_IP, MAX_PATH ); 
		m_wPORT = m_info.m_nFTP_Port; 
		SetDefaultDirectory( m_info.m_szServerName[m_nServerNumber] ); 
	} 
	else 
	{ 
		m_bLoadUpdateInfo = FALSE; 
		ZeroMemory( m_szIPADDR, MAX_PATH ); 
		strncpy( m_szIPADDR, "127.0.0.1", MAX_PATH ); 
		m_wPORT = DEFAULT_FTP_PORT; 
	} 
 
	if( !LoadLocalVerInfo() ) 
		return FALSE; 
 
	SetDefaultData(); 
 
	return TRUE; 
} 
 
WZ_DECLAREDLL void CWZUpdateModule::SetDefaultDirectory( char* pszDir ) 
{ 
	if( !pszDir )	return; 
 
	strncpy( m_szDefaultDirectory, pszDir, MAX_PATH ); 
} 
 
//±âº» µð·ºÅ丮 °æ·Î¸¦ Æ÷ÇÔÇÏ´Â FTP¼­¹ö»óÀÇ ¹öÀüÆÄÀÏ °æ·Î¸¦ ±¸ÇÑ´Ù. 
WZ_DECLAREDLL void CWZUpdateModule::GetVersionFilePath( TCHAR* pszVerFilePath, int nSize ) 
{ 
	if( m_szDefaultDirectory == NULL || (strcmp( m_szDefaultDirectory, "" ) == 0 ) ) 
		strncpy( pszVerFilePath, m_szVersionFileName, nSize );				//¸¸ÀÏ µðÆúÆ® µð·ºÅ丮°¡ ¾øÀ¸¸é ·çÆ®¿¡¼­ ã´Â´Ù. 
	else 
		_snprintf( pszVerFilePath, nSize, "%s\\%s", m_szDefaultDirectory, m_szVersionFileName ); 
} 
 
//ÆÄÀϸ®½ºÆ® ÆÄÀÏÀº ¹Ýµå½Ã ´Ù¿î·Îµå ¹Þ´Â ¹öÀüÆú´õ¿¡ Á¸ÀçÇØ¾ß ÇÑ´Ù. 
//¿¹ : AgentServer\00.00.01\filelist.dat 
WZ_DECLAREDLL void CWZUpdateModule::GetFileListFilePath( char* pszFilePath, int nSize, const char* pszVerFolder ) 
{ 
	if( m_szDefaultDirectory == NULL || (strcmp( m_szDefaultDirectory, "" ) == 0 ) ) 
		_snprintf( pszFilePath, nSize, "%s\\%s", pszVerFolder, DEFAULT_FILELIST_FILE ); 
	else 
		_snprintf( pszFilePath, nSize, "%s\\%s\\%s", m_szDefaultDirectory, pszVerFolder, DEFAULT_FILELIST_FILE ); 
} 
 
//¹öÀüÆú´õÀÇ °æ·Î¸¦ ¹ÝȯÇÑ´Ù. 
WZ_DECLAREDLL void CWZUpdateModule::GetVersionFolderPath( char* pszFileName, int nSize, const char* pszVerFolder ) 
{ 
	if( m_szDefaultDirectory == NULL || (strcmp( m_szDefaultDirectory, "" ) == 0 ) ) 
		strncpy( pszFileName, pszVerFolder, nSize ); 
	else 
		_snprintf( pszFileName, nSize, "%s\\%s", m_szDefaultDirectory, pszVerFolder ); 
} 
 
 
WZ_DECLAREDLL void CWZUpdateModule::GetServerName( char* pszServerName, int nSize ) 
{ 
	_snprintf( pszServerName, nSize, "%s", m_info.m_szServerName[m_nServerNumber] ); 
}