笑看风云

记录生活中的启迪与感动
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

使用ADO读写excel表(windows服务程序)

Posted on 2010-01-15 10:43  清晨的风  阅读(1355)  评论(0)    收藏  举报
// UpdateServ.cpp : 定义应用程序的入口点。
//

#include "stdafx.h"
#include "UpdateServ.h"


// 全局变量:
#define LOG_ENABLE
#define LOGFILE			_T("update.log")
#define CONFIGFILE		_T("config.ini")
#define NUM_CLIENTS		10		//listen
#define BUFSIZE			100		

typedef struct _INFO
{
	char	version[10];
	char	url[50];
	USHORT	port;
} INFO, *PINFO;

TCHAR szServiceName[] = _T("UpdateServ");
BOOL bInstall;
SERVICE_STATUS_HANDLE hServiceStatus;
SERVICE_STATUS status;
DWORD dwThreadID;

// 此代码模块中包含的函数的前向声明:
void Init();
BOOL IsInstalled();
BOOL Install();
BOOL Uninstall();
void WINAPI ServiceMain();
void WINAPI ServiceCtrl(DWORD dwOpcode);
int WriteToLog(char* str);			//the log file stored in the current directory
int ReadConfigFile(PINFO info);		//format: XXX=XXX read config issue from the current directory



int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)
{
	Init();

	dwThreadID = ::GetCurrentThreadId();

	SERVICE_TABLE_ENTRY st[] =
	{
		{ szServiceName, (LPSERVICE_MAIN_FUNCTION)ServiceMain },
		{ NULL, NULL }
	};

	if (_tcscmp(lpCmdLine, _T("-install")) == 0)
	{
		Install();
	}
	else if (_tcscmp(lpCmdLine, _T("-uninstall")) == 0)
	{
		Uninstall();
	}
	else
	{
		if (!::StartServiceCtrlDispatcher(st))
		{
#ifdef LOG_ENABLE
			WriteToLog("Register Service Main Function Error!");
#endif
		}
	}

	return 0;
}

//*********************************************************
//Functiopn:			Init
//Description:			初始化
//Calls:				main
//Called By:				
//Table Accessed:				
//Table Updated:				
//Input:				
//Output:				
//Return:				
//Others:				
//History:				
//*********************************************************
void Init()
{
	hServiceStatus = NULL;
	status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
	status.dwCurrentState = SERVICE_STOPPED;
	status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
	status.dwWin32ExitCode = 0;
	status.dwServiceSpecificExitCode = 0;
	status.dwCheckPoint = 0;
	status.dwWaitHint = 0;
}

//*********************************************************
//Functiopn:			ServiceMain
//Description:			服务主函数,这在里进行控制对服务控制的注册
//Calls:
//Called By:
//Table Accessed:
//Table Updated:
//Input:
//Output:
//Return:
//Others:
//History:
//*********************************************************
void WINAPI ServiceMain()
{
	// Register the control request handler
	status.dwCurrentState = SERVICE_START_PENDING;
	status.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;

	//注册服务控制
	hServiceStatus = RegisterServiceCtrlHandler(szServiceName, ServiceCtrl);
	if (hServiceStatus == NULL)
	{
#ifdef LOG_ENABLE
		WriteToLog("Service Handler not installed");
#endif

		return;
	}
	SetServiceStatus(hServiceStatus, &status);

	status.dwWin32ExitCode = S_OK;
	status.dwCheckPoint = 0;
	status.dwWaitHint = 0;
	status.dwCurrentState = SERVICE_RUNNING;
	SetServiceStatus(hServiceStatus, &status);

	//-------------------------------------------------------------------
	WSADATA wsaData;
	WORD sockVersion = MAKEWORD(2, 0);

	//initial
	if(WSAStartup(sockVersion, &wsaData))
	{
#ifdef LOG_ENABLE
		WriteToLog("Win Socket Version error.\n");
#endif
		return;
	}

	//create socket
	SOCKET sock_serv = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if(INVALID_SOCKET == sock_serv)
	{
#ifdef LOG_ENABLE
		WriteToLog("Create socket error.\n");
#endif
		WSACleanup();
		return;
	}

	//get port set from config file
	INFO info;
	ZeroMemory(&info, sizeof(info));
	if(ReadConfigFile(&info) == 0)
	{
#ifdef LOG_ENABLE
		WriteToLog("Read config file error.\n");
#endif
		exit(1);
	}

	//set param
	sockaddr_in addr_sev;
	addr_sev.sin_family = AF_INET;
	addr_sev.sin_port = htons(info.port);
	addr_sev.sin_addr.s_addr = INADDR_ANY;		//inet_addr("127.0.0.1");

	//bind
	if(SOCKET_ERROR == bind(sock_serv, (sockaddr *)&addr_sev, sizeof(addr_sev)))
	{
		DWORD dwErr = WSAGetLastError();
		char str[100] = "";
		sprintf_s(str, 100, "Socket bind error, error code is %d.\n", dwErr);
#ifdef LOG_ENABLE
		WriteToLog(str);
#endif
		closesocket(sock_serv);
		sock_serv = 0;
		WSACleanup();
		return;
	}

	////debug
	//char strPort[100];
	//sprintf_s(strPort, 100, "Socket bind succeed, and port is %d.\n", info.port);
	//WriteToLog(strPort);
	
	//listen
	if(SOCKET_ERROR == listen(sock_serv, NUM_CLIENTS))
	{
		DWORD dwErr = WSAGetLastError();
		char str[100] = "";
		sprintf_s(str, 100, "Socket bind error, error code is %d.\n", dwErr);
#ifdef LOG_ENABLE
		WriteToLog(str);
#endif
		closesocket(sock_serv);
		sock_serv = 0;
		WSACleanup();
	}

	//debug
	//WriteToLog("start listening\n");

	char buf[BUFSIZE];
	sockaddr_in addrRemote;
	ZeroMemory(&addrRemote, sizeof(sockaddr_in));

	//-------------------------------------------------------------------------------------

	//程序所在目录路径
	TCHAR exeFullPath[MAX_PATH];
	::GetModuleFileName(NULL,exeFullPath,MAX_PATH);
	CString strAppPath = exeFullPath;
	strAppPath.Format(_T("%s"),exeFullPath);
	strAppPath = strAppPath.Left(strAppPath.ReverseFind( '\\' )) + _T("\\excel\\");

	SYSTEMTIME st;
	GetLocalTime(&st);
	WORD flagDay = st.wDay;

	CString filename;
	filename.Format(_T("%d%.2d%.2d.xls"), st.wYear, st.wMonth, st.wDay);	
	CString excel_path = strAppPath + filename;

	::CoInitialize(NULL);

	CString ConnectionString;
	ConnectionString = _T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=");   
	ConnectionString += excel_path;  
	ConnectionString += _T(";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=0\"");
	BSTR resultsString = ConnectionString.AllocSysString();	


	_ConnectionPtr pCon_ex;
	_RecordsetPtr  pRst;
	_variant_t RecordsAffected;
	HRESULT hr;

	if(PathFileExists(excel_path))		//excel file  existed
	{
		DeleteFile(excel_path);			//delete existed file

		hr = pCon_ex.CreateInstance("ADODB.Connection");///创建Connection对象
		if(FAILED(hr))
		{
			//MessageBoxA(NULL, "Can not create ado instance!", "error", MB_OK);
#ifdef LOG_ENABLE
			WriteToLog("Can not create ado instance.\n");
#endif
			pCon_ex->Close();
			return;
		}

		hr = pCon_ex->Open(resultsString,"","",adModeUnknown);///连接数据库
		if (FAILED(hr))
		{
			//MessageBoxA(NULL, "Can not open db!", "error", MB_OK);
#ifdef LOG_ENABLE
			WriteToLog("Can not open db.\n");
#endif
			pCon_ex->Close();
			return;
		}

		pCon_ex->Execute("CREATE TABLE registerinfo(ip TEXT, machine_code TEXT, sn TEXT, mac TEXT)", \
			&RecordsAffected, adCmdText);

		pRst.CreateInstance("ADODB.Recordset");		
	}
	else								//excel file not existed
	{
		CreateDirectory(strAppPath, NULL);

		hr = pCon_ex.CreateInstance("ADODB.Connection");///创建Connection对象
		if(FAILED(hr))
		{
			//MessageBoxA(NULL, "Can not create ado instance!", "error", MB_OK);
#ifdef LOG_ENABLE
			WriteToLog("Can not create ado instance.\n");
#endif
			pCon_ex->Close();
			return;
		}

		hr = pCon_ex->Open(resultsString,"","",adModeUnknown);///连接数据库
		if (FAILED(hr))
		{
			//MessageBoxA(NULL, "Can not open db!", "error", MB_OK);
#ifdef LOG_ENABLE
			WriteToLog("Can not open db.\n");
#endif
			pCon_ex->Close();
			return;
		}

		pCon_ex->Execute("CREATE TABLE registerinfo(ip TEXT, machine_code TEXT, sn TEXT, mac TEXT)", \
			&RecordsAffected, adCmdText);

		pRst.CreateInstance("ADODB.Recordset");		
	}


	//---------------------------------------------------------------------------------------


	while (1)
	{
		/////////////////////////////////////////////////////////////////////////////////////////
		// create new excel file
		GetLocalTime(&st);

		if (flagDay != st.wDay)
		{
			flagDay = st.wDay;
			
			if (pRst->State == 1)
			{
				pRst->Close();
				pRst = NULL;
			}

			pCon_ex->Close();

			filename.Format(_T("%d%.2d%.2d.xls"), st.wYear, st.wMonth, st.wDay);	
			excel_path = strAppPath + filename;


			ConnectionString = _T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=");   
			ConnectionString += excel_path;  
			ConnectionString += _T(";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=0\"");

			resultsString = ConnectionString.AllocSysString();

			hr = pCon_ex.CreateInstance("ADODB.Connection");///创建Connection对象
			if(FAILED(hr))
			{
#ifdef LOG_ENABLE
				WriteToLog("Can not create ado instance.\n");
#endif
				pCon_ex->Close();
				continue;
			}

			hr = pCon_ex->Open(resultsString,"","",adModeUnknown);///连接数据库
			if (FAILED(hr))
			{
				//MessageBoxA(NULL, "Can not open db!", "error", MB_OK);
#ifdef LOG_ENABLE
				WriteToLog("Can not open db.\n");
#endif
				pCon_ex->Close();
				continue;
			}

			pCon_ex->Execute("CREATE TABLE registerinfo(ip TEXT, machine_code TEXT, sn TEXT, mac TEXT)", \
				&RecordsAffected, adCmdText);

			pRst.CreateInstance("ADODB.Recordset");
		}
		///////////////////////////////////////////////////////////////////////////////////////////////////////////

		//initial file descriptor set
		fd_set read_fds;				//申明一个 fd_set 集合来保存我们要检测的 socket描述符
		FD_ZERO(&read_fds);				//用select函数之前先把集合清零
		FD_SET(sock_serv, &read_fds);	//把要检测的描述符socket加入到集合里

		//set timeout	
		struct timeval timeout;	
		timeout.tv_sec = 2; 
		timeout.tv_usec = 0;

		//select
		int nRet = select((int)sock_serv, &read_fds, NULL, NULL, &timeout);
		if (nRet < 0)		//error
		{
#ifdef LOG_ENABLE
			WriteToLog("Socket select error.\n");
#endif
			continue;
		}
		else if (0 == nRet)	//time out
		{
			//#ifdef LOG_ENABLE
			//			WriteToLog("Socket select time out.\n");
			//#endif
			continue;
		}
		else				//ok
		{
			for(int i = 0; i<(int)read_fds.fd_count; i++)
			{
				if(FD_ISSET(read_fds.fd_array[i], &read_fds))
				{
					unsigned long ulBlocking = 0;
					ioctlsocket(read_fds.fd_array[i], FIONBIO, &ulBlocking);
					if(read_fds.fd_array[i] == sock_serv)
					{
						if(read_fds.fd_count < FD_SETSIZE)
						{
							/*sockaddr_in addrRemote;*/
							int nAddrLen = sizeof(addrRemote);
							SOCKET sNew = accept(sock_serv, (SOCKADDR*)&addrRemote, &nAddrLen);
							FD_SET(sNew, &read_fds);
						}
						else
						{
#ifdef LOG_ENABLE
							WriteToLog("Too much connections! \n");
#endif
							continue;
						}
					}
					else
					{
						//int nRecv = ReceiveSocket(fdSocket.fd_array[i], recvbuffer, recvlen);
						if (INVALID_SOCKET == read_fds.fd_array[i])
						{
#ifdef LOG_ENABLE
							WriteToLog("Failed to accept.\n");
#endif
							continue;
						}
						ZeroMemory(buf, BUFSIZE);
						int nRecv = recv(read_fds.fd_array[i], buf, BUFSIZE, 0);
						if(nRecv > 0)
						{
							if(buf[0] == 'q')
							{
								ZeroMemory(buf, BUFSIZE);
								ZeroMemory(&info, sizeof(info));

								if(ReadConfigFile(&info) == 0)
								{
#ifdef LOG_ENABLE
									WriteToLog("Read config file error.\n");
#endif
									return;
								}
								else
								{
									strcpy(buf, info.version);
									strcat(buf, ";");
									strcat(buf, info.url);
									strcat(buf, "\n");
								}

								if(send(read_fds.fd_array[i], buf, strlen(buf), 0) <= 0)
								{
#ifdef LOG_ENABLE
									WriteToLog("Failed to send.\n");
#endif
									closesocket(read_fds.fd_array[i]);
									FD_CLR(read_fds.fd_array[i], &read_fds);
									continue;
								}
								else
								{
									nRecv = recv(read_fds.fd_array[i], buf, BUFSIZE, 0);
									//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
									if (nRecv > 0 && buf[0] == ';')
									{
										char machine_code[30];		//machine code, should less than 15 byte
										char sn[50];				//register code			
										char mac[20];				//mac
										ZeroMemory(machine_code, 30);
										ZeroMemory(sn, 50);
										ZeroMemory(mac, 20);
										char* flag = strstr(buf+1, ";");
										if (flag != NULL)
										{
											memcpy(machine_code, buf+1, flag-buf-1);
											char* str_start = flag+1;
											flag = strstr(str_start, ";");
											memcpy(sn, str_start, flag-str_start);
											if (flag+1 != NULL)	// not XXX;;
											{
												str_start = flag+1;
												flag = strstr(str_start, ";");
												if (flag != NULL)
												{
													memcpy(mac, str_start, flag-str_start);
												}
												else
												{
													closesocket(read_fds.fd_array[i]);
													read_fds.fd_array[i] = 0;
													FD_CLR(read_fds.fd_array[i], &read_fds);
													continue;
												}
											}
											else
											{
												closesocket(read_fds.fd_array[i]);
												read_fds.fd_array[i] = 0;
												FD_CLR(read_fds.fd_array[i], &read_fds);
												continue;
											}

											//TODO: resolve client ip, and store all these data to database

											//get ip
											TCHAR ip[16];
											ZeroMemory(ip, 16*sizeof(TCHAR));
											unsigned char* s = (unsigned char*)&(addrRemote.sin_addr.S_un);
											if (s[0] != 0)
											{
												TCHAR str[4];
												ZeroMemory(str, 4*sizeof(TCHAR));
												_itot((int)s[0], str, 10);
												_tcscat(ip, str);
												_tcscat(ip, _T("."));
												ZeroMemory(str, 4*sizeof(TCHAR));
												_itot((int)s[1], str, 10);
												_tcscat(ip, str);
												_tcscat(ip, _T("."));
												ZeroMemory(str, 4*sizeof(TCHAR));
												_itot((int)s[2], str, 10);
												_tcscat(ip, str);
												_tcscat(ip, _T("."));
												ZeroMemory(str, 4*sizeof(TCHAR));
												_itot((int)s[3], str, 10);
												_tcscat(ip, str);

												//======================store db========================
												
												CString strMachineCode;
												//strMachineCode.Format(_T("%s"), machine_code);
												strMachineCode = machine_code;
												CString strSn;
												strSn = sn;
												CString strMac;
												strMac = mac;

												CString sql;
												sql.Format(_T("SELECT COUNT(*) FROM registerinfo WHERE ip = '%s' and machine_code = '%s'"), ip, strMachineCode);
												BSTR sqlString = sql.AllocSysString();
												pRst =  pCon_ex->Execute(sqlString, &RecordsAffected, adCmdText);

												int n = pRst->GetCollect(_variant_t(long(0)));   

												if (n == 0)
												{
													CString sql;
													sql.Format(_T("INSERT INTO registerinfo(ip, machine_code, sn, mac) VALUES \
																  ('%s', '%s', '%s', '%s')"), ip, strMachineCode, strSn, strMac);
													BSTR sqlString = sql.AllocSysString();
													pCon_ex->Execute(sqlString, &RecordsAffected,adCmdText);	
												}									
												//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
											}											
											closesocket(read_fds.fd_array[i]);
											read_fds.fd_array[i] = 0;
											FD_CLR(read_fds.fd_array[i], &read_fds);
											continue;
										}
										else
										{
											closesocket(read_fds.fd_array[i]);
											read_fds.fd_array[i] = 0;
											FD_CLR(read_fds.fd_array[i], &read_fds);
											continue;
										}										
									}
									else
									{
										closesocket(read_fds.fd_array[i]);
										read_fds.fd_array[i] = 0;
										FD_CLR(read_fds.fd_array[i], &read_fds);
										continue;
									}	

								}
							}
							else
							{
#ifdef LOG_ENABLE
								WriteToLog("Received protocol error.\n");
#endif
								closesocket(read_fds.fd_array[i]);
								FD_CLR(read_fds.fd_array[i], &read_fds);
								continue;
							}
						}
						else
						{
#ifdef LOG_ENABLE
							WriteToLog("Failed to receive.\n");
#endif
							closesocket(read_fds.fd_array[i]);
							FD_CLR(read_fds.fd_array[i], &read_fds);
						}
					}
				}
			}			//end for
		}
	}					//end while

	pRst->Close();
	pCon_ex->Close();

	::CoUninitialize();		//释放程序占用的COM 资源。
	//============================================================================================

	status.dwCurrentState = SERVICE_STOPPED;
	SetServiceStatus(hServiceStatus, &status);

#ifdef LOG_ENABLE
	WriteToLog("Service stopped.\n");
#endif
}

//*********************************************************
//Functiopn:			ServiceCtrl
//Description:			服务控制主函数,这里实现对服务的控制,
//						当在服务管理器上停止或其它操作时,将会运行此处代码
//Calls:
//Called By:
//Table Accessed:
//Table Updated:
//Input:				dwOpcode:控制服务的状态
//Output:
//Return:
//Others:
//History:
//*********************************************************
void WINAPI ServiceCtrl(DWORD dwOpcode)
{
	switch (dwOpcode)
	{
	case SERVICE_CONTROL_STOP:
		status.dwWin32ExitCode = 0;
		status.dwCurrentState = SERVICE_STOPPED;
		SetServiceStatus(hServiceStatus, &status);
		//PostThreadMessage(dwThreadID, WM_CLOSE, 0, 0);
		break;
	case SERVICE_CONTROL_PAUSE:
		break;
	case SERVICE_CONTROL_CONTINUE:
		break;
	case SERVICE_CONTROL_INTERROGATE:
		break;
	case SERVICE_CONTROL_SHUTDOWN:
		status.dwWin32ExitCode = 0;
		status.dwCurrentState = SERVICE_STOPPED;
		SetServiceStatus(hServiceStatus, &status);
		break;
	default:
#ifdef LOG_ENABLE
		WriteToLog("Bad service request.\n");
#endif
		break;
	}
}
//*********************************************************
//Functiopn:			IsInstalled
//Description:			判断服务是否已经被安装
//Calls:
//Called By:
//Table Accessed:
//Table Updated:
//Input:
//Output:
//Return:
//Others:
//History:
//*********************************************************
BOOL IsInstalled()
{
	BOOL bResult = FALSE;

	//打开服务控制管理器
	SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

	if (hSCM != NULL)
	{
		//打开服务
		SC_HANDLE hService = ::OpenService(hSCM, szServiceName, SERVICE_QUERY_CONFIG);
		if (hService != NULL)
		{
			bResult = TRUE;
			::CloseServiceHandle(hService);
		}
		::CloseServiceHandle(hSCM);
	}
	return bResult;
}

//*********************************************************
//Functiopn:			Install
//Description:			安装服务函数
//Calls:
//Called By:
//Table Accessed:
//Table Updated:
//Input:
//Output:
//Return:
//Others:
//History:
//*********************************************************
BOOL Install()
{
	if (IsInstalled())
		return TRUE;

	//打开服务控制管理器
	SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
	if (hSCM == NULL)
	{
		//MessageBox(NULL, _T("Couldn't open service manager"), szServiceName, MB_OK);
		return FALSE;
	}

	// Get the executable file path
	TCHAR szFilePath[MAX_PATH];
	::GetModuleFileName(NULL, szFilePath, MAX_PATH);

	//创建服务
	SC_HANDLE hService = ::CreateService(
		hSCM, szServiceName, szServiceName,
		SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS /*| SERVICE_INTERACTIVE_PROCESS*/,
		SERVICE_AUTO_START, SERVICE_ERROR_NORMAL,
		szFilePath, NULL, NULL, _T(""), NULL, NULL);

	if (hService == NULL)
	{
		::CloseServiceHandle(hSCM);
		//MessageBox(NULL, _T("Couldn't create service"), szServiceName, MB_OK);
		return FALSE;
	}

	if (::StartService(hService, 0, NULL))
	{
#ifdef LOG_ENABLE
		WriteToLog("update service started successfully!\n");
#endif

	}

	::CloseServiceHandle(hService);
	::CloseServiceHandle(hSCM);
	return TRUE;
}

//*********************************************************
//Functiopn:			Uninstall
//Description:			删除服务函数
//Calls:
//Called By:
//Table Accessed:
//Table Updated:
//Input:
//Output:
//Return:
//Others:
//History:
//*********************************************************
BOOL Uninstall()
{
	if (!IsInstalled())
		return TRUE;

	SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);

	if (hSCM == NULL)
	{
		//MessageBox(NULL, _T("Couldn't open service manager"), szServiceName, MB_OK);
		return FALSE;
	}

	SC_HANDLE hService = ::OpenService(hSCM, szServiceName, SERVICE_STOP | DELETE);

	if (hService == NULL)
	{
		::CloseServiceHandle(hSCM);
		//MessageBox(NULL, _T("Couldn't open service"), szServiceName, MB_OK);
		return FALSE;
	}
	//SERVICE_STATUS status;
	::ControlService(hService, SERVICE_CONTROL_STOP, &status);

	//删除服务
	BOOL bDelete = ::DeleteService(hService);
	::CloseServiceHandle(hService);
	::CloseServiceHandle(hSCM);

	if (bDelete)
		return TRUE;

#ifdef LOG_ENABLE
	WriteToLog("Service could not be deleted.\n");
#endif

	return FALSE;
}


//=======================================================================================

int WriteToLog(char* str)
{
	//get current directory
	TCHAR szFilePath[MAX_PATH];
	::GetModuleFileName(NULL, szFilePath, MAX_PATH);
	TCHAR* flag1 = szFilePath;
	TCHAR* flag2 = flag1;
	while((flag1 = _tcsstr(flag1+1, _T("\\"))) != NULL)
	{
		flag2 = flag1;
	}
	memset(flag2+1, 0, (&szFilePath[MAX_PATH]-flag2-1));
	_tcscat(szFilePath, LOGFILE);
	int nLen = WideCharToMultiByte( CP_ACP, 0, szFilePath, -1, NULL, 0, NULL, NULL );
	char file_path[MAX_PATH];
	ZeroMemory(file_path, MAX_PATH);
	WideCharToMultiByte( CP_ACP, 0, szFilePath, -1, file_path, nLen, NULL, NULL );

	//open file
	errno_t err;
	FILE* log;
	err = fopen_s(&log, file_path, "a+");
	if (log == NULL || err != 0)
	{
		OutputDebugStringA("Log file open failed.");
		return 0;
	}

	//get system time
	SYSTEMTIME st;
	GetLocalTime(&st);
	char strTime[100] = "";
	sprintf_s(strTime, 100, "%d-%.2d-%.2d %.2d:%.2d:%.2d  \t", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
	fprintf(log, "%s", strTime);
	fprintf(log, "%s", str);
	fclose(log);
	return 1;
}


int ReadConfigFile(PINFO info)
{
	TCHAR szFilePath[MAX_PATH];
	::GetModuleFileName(NULL, szFilePath, MAX_PATH);
	TCHAR* flag1 = szFilePath;
	TCHAR* flag2 = flag1;
	while((flag1 = _tcsstr(flag1+1, _T("\\"))) != NULL)
	{
		flag2 = flag1;
	}
	memset(flag2+1, 0, (&szFilePath[MAX_PATH]-flag2-1));
	_tcscat(szFilePath, CONFIGFILE);
	int nLen = WideCharToMultiByte( CP_ACP, 0, szFilePath, -1, NULL, 0, NULL, NULL );
	char file_path[MAX_PATH];
	ZeroMemory(file_path, MAX_PATH);
	WideCharToMultiByte( CP_ACP, 0, szFilePath, -1, file_path, nLen, NULL, NULL );

	ifstream   infile(file_path);   
	if   (!infile)   
	{
		//MessageBoxA(NULL, "Load config file error","Config error", MB_OK | MB_ICONERROR);
#ifdef LOG_ENABLE
		WriteToLog("Load config file error.\n");
#endif
		return 0;
	}
	else
	{ 
		char buf[100];
		ZeroMemory(buf, 100);

		//get version
		infile.getline(buf, 100); 
		char* flag = strstr(buf, "=") + 1;
		strncpy(info->version, flag, strlen(flag));
		ZeroMemory(buf, 100);

		//get url
		infile.getline(buf, 100); 
		flag = strstr(buf, "=") + 1;
		strncpy(info->url, flag, strlen(flag));
		ZeroMemory(buf, 100);

		//get port
		infile.getline(buf, 100); 
		flag = strstr(buf, "=") + 1;
		char port[10];
		strncpy(port, flag, strlen(flag));
		info->port = atoi(port);

		infile.close();
		return 1;
	}
}