/******************************************************************************* * * 模 块 名:DBService 文件名:ServiceBody.c * 相关文件:DBService.h * 提交日期:2012.2.1 作 者:Alex * 版 本:0.1 * 模块描述: * 本模块提供了用户定义的服务启动和停止程序 * ServiceStart (DWORD dwArgc, LPTSTR *lpszArgv); * ServiceStop(); * 修改记录: * 日 期 版本 修改人 修改内容 * * *******************************************************************************/ #ifdef _WIN32 #include #include #include #include #include #include #include #include "DBService.h" #include "ServiceInit.h" // this event is signalled when the service should end static HANDLE hServerStopEvent = NULL; DWORD g_unThreadId = 0; TCHAR strErr[256]; void ServiceStart (DWORD dwArgc, LPTSTR *lpszArgv) { if (!ReportStatusToSCMgr( SERVICE_START_PENDING, // service state NO_ERROR, // exit code 3000)) // wait hint { _tprintf(TEXT("ServiceStart failed - %s\n"), GetLastErrorText(strErr,256)); return; } char *parm = 0; if(dwArgc>=2) parm = lpszArgv[1]; HANDLE thread = (HANDLE)CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)DBMain, NULL, 0, &g_unThreadId ); if( !thread ){ _tprintf(TEXT("CreateThread failed - %s\n"), GetLastErrorText(strErr,256)); goto cleanup; } hServerStopEvent = CreateEvent( NULL, // no security attributes TRUE, // manual reset event FALSE, // not-signalled SZSTOPEVENTNAME); // named if ( hServerStopEvent == NULL){ _tprintf(TEXT("CreateEvent(ServerStopEvent) failed - %s\n"), GetLastErrorText(strErr,256)); goto cleanup; } if (!ReportStatusToSCMgr( SERVICE_RUNNING, // service state NO_ERROR, // exit code 0)) // wait hint { _tprintf(TEXT("ReportStatusToSCMgr failed - %s\n"), GetLastErrorText(strErr,256)); goto cleanup; } WaitForSingleObject(hServerStopEvent, INFINITE); // _tprintf(TEXT("hServerStopEvent signaled!\n")); cleanup: if( g_unThreadId!=0 ){ PostThreadMessage( g_unThreadId, WM_CLOSE, 0, 0L ); } if( g_hEvServiceThread ){ if(WAIT_OBJECT_0!=WaitForSingleObject(g_hEvServiceThread,15000)) { TerminateThread(thread, 1); _tprintf(TEXT("TerminateThread %s\n"), GetLastErrorText(strErr,256)); } else{ // _tprintf(TEXT("g_hEvMcuThread signaled!\n")); } CloseHandle( g_hEvServiceThread ); } if( thread ){ if (WAIT_OBJECT_0 != WaitForSingleObject(thread,1000)){ TerminateThread(thread, 2); } CloseHandle( thread ); _tprintf(TEXT("CloseHandle() %s\n"), GetLastErrorText(strErr,256)); } if(hServerStopEvent){ CloseHandle(hServerStopEvent); } } VOID ServiceStop() { if ( hServerStopEvent ) SetEvent(hServerStopEvent); } #endif