/****************************************************************************** * * $Id: sftc_3d_app_service.cpp,v 1.1 2004/06/04 21:28:28 mli Exp $ * * Copyright (C) Scientific Forming Technologies Corp. * All rights reserved. * * Author : Michael Li * Date : May 28, 2004 * * Start/Stop DEFORM 3D application server service * ******************************************************************************/ #include #include #include #include #include #include #include #include #ifdef __cplusplus #ifndef MESSAGEBOX #define MESSAGEBOX ::MessageBox #endif #else #ifndef MESSAGEBOX #define MESSAGEBOX MessageBox #endif #endif void ServiceMain(DWORD argc, LPTSTR *argv); void ServiceCtrlHandler(DWORD nControlCode); BOOL UpdateServiceStatus( DWORD dwCurrentState, DWORD dwWin32ExitCode, DWORD dwServiceSpecificExitCode, DWORD dwCheckPoint, DWORD dwWaitHint); BOOL StartServiceThread(); DWORD ServiceExecutionThread(LPDWORD param); HANDLE hServiceThread; void KillService(); char *strServiceName = "DEFORM3DAppService"; SERVICE_STATUS_HANDLE nServiceStatusHandle; HANDLE killServiceEvent = NULL; BOOL nServiceRunning = FALSE; DWORD nServiceCurrentStatus = 0; HANDLE h3DAppService = NULL; //#define RUN_SFTC_3D_APP_SERVICE "run3apse.exe" #define RUN_SFTC_3D_APP_SERVICE "def_as.bat" #define SFTC_SERVER_PID_FILE "COM\\server_queue_fem\\config\\sftc_3d_win_app_server.pid" #define SFTC_SERVER_LOG_FILE "COM\\server_queue_fem\\log\\server_running_log.txt" #define SFTC_SERVER_STARTING_LOG_FILE "COM\\server_queue_fem\\log\\server_starting_log.txt" #define SFTC_SERVER_START_FILE "COM\\server_queue_fem\\bin\\sftc_3d_win_app_server.bat" #define SFTC_SERVER_PYTHON_FILE "COM\\server_queue_fem\\kernel\\sftc_server.py" #define SFTC_SERVER_PYTHON_COMMAND "PYTHON\\python.exe" #define SFTC_SERVER_START_FOLDER "COM\\server_queue_fem\\bin" #define SFTC_100PERCENT_SYMBOL "%" char szStartingFolder[1024]; int isFileExist(const char * szFileName); int deleteFile(const char* pszFileName); void main(int argc, char* argv[]) { static char* szDebugCaption = "DEFORM - DEBUG"; char* lpMark=NULL; int nRetCode = 0; int nShowDebugMessage = 0; int i = 0; int nLen = 0; char szBuffer[1024]; char szCurrentFolder[_MAX_PATH]; SERVICE_TABLE_ENTRY servicetable[]= { {strServiceName,(LPSERVICE_MAIN_FUNCTION)ServiceMain}, {NULL,NULL} }; BOOL success = FALSE; #if 0 // 0 comment out char szCommand[1024]; char szFullPidFile[1024]; char szFullLogFile[1024]; char szFullStartingLogFile[1024]; char szFullStartFile[1024]; char szFullPythonFile[1024]; char szFullPythonCommand[1024]; char szFullStartFolder[1024]; #endif // 0 comment out for(i=0; i %s", szFullPythonCommand, szFullPythonFile, szFullPidFile, szFullStartingLogFile, szFullLogFile ); #endif // 0 comment out success=StartServiceCtrlDispatcher(servicetable); if(!success) { //error occured } } void ServiceMain(DWORD argc, LPTSTR *argv) { BOOL success; nServiceStatusHandle=RegisterServiceCtrlHandler( strServiceName, (LPHANDLER_FUNCTION)ServiceCtrlHandler); if(!nServiceStatusHandle) { return; } success=UpdateServiceStatus( SERVICE_START_PENDING,NO_ERROR,0,1,3000); if(!success) { return; } killServiceEvent=CreateEvent(0,TRUE,FALSE,0); if(killServiceEvent==NULL) { return; } success=UpdateServiceStatus( SERVICE_START_PENDING,NO_ERROR,0,2,1000); if(!success) { return; } success=StartServiceThread(); if(!success) { return; } nServiceCurrentStatus=SERVICE_RUNNING; success=UpdateServiceStatus(SERVICE_RUNNING,NO_ERROR,0,0,0); if(!success) { return; } WaitForSingleObject(killServiceEvent,INFINITE); CloseHandle(killServiceEvent); } BOOL UpdateServiceStatus( DWORD dwCurrentState, DWORD dwWin32ExitCode, DWORD dwServiceSpecificExitCode, DWORD dwCheckPoint, DWORD dwWaitHint) { BOOL success; SERVICE_STATUS nServiceStatus; nServiceStatus.dwServiceType=SERVICE_WIN32_OWN_PROCESS; nServiceStatus.dwCurrentState=dwCurrentState; if(dwCurrentState==SERVICE_START_PENDING) { nServiceStatus.dwControlsAccepted=0; } else { nServiceStatus.dwControlsAccepted=SERVICE_ACCEPT_STOP |SERVICE_ACCEPT_SHUTDOWN; } if(dwServiceSpecificExitCode==0) { nServiceStatus.dwWin32ExitCode=dwWin32ExitCode; } else { nServiceStatus.dwWin32ExitCode=ERROR_SERVICE_SPECIFIC_ERROR; } nServiceStatus.dwServiceSpecificExitCode= dwServiceSpecificExitCode; nServiceStatus.dwCheckPoint=dwCheckPoint; nServiceStatus.dwWaitHint=dwWaitHint; success=SetServiceStatus(nServiceStatusHandle,&nServiceStatus); if(!success) { KillService(); return success; } else return success; } BOOL StartServiceThread() { DWORD id; hServiceThread=CreateThread(0,0, (LPTHREAD_START_ROUTINE)ServiceExecutionThread, 0,0,&id); if(hServiceThread==0) { return false; } else { nServiceRunning=true; return true; } } DWORD ServiceExecutionThread(LPDWORD param) { char szCommand[1024]; char szFullPidFile[1024]; char szFullLogFile[1024]; char szFullStartingLogFile[1024]; char szFullStartFile[1024]; char szFullPythonFile[1024]; char szFullPythonCommand[1024]; char szFullStartFolder[1024]; int nRetCode = 0; char* args[64]; STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); ZeroMemory( &pi, sizeof(pi) ); memset(args, 0, 64*sizeof(char)); h3DAppService = NULL; if ( szStartingFolder ) { _chdir(szStartingFolder); } strcpy(szFullPidFile, szStartingFolder); strcat(szFullPidFile, SFTC_SERVER_PID_FILE); strcpy(szFullLogFile, szStartingFolder); strcat(szFullLogFile, SFTC_SERVER_LOG_FILE); strcpy(szFullStartingLogFile, szStartingFolder); strcat(szFullStartingLogFile, SFTC_SERVER_STARTING_LOG_FILE); #if 0 // debug purpose strcpy(szFullStartingLogFile, "C:\\Temp\\t.log"); #endif // debug purpose strcpy(szFullStartFile, szStartingFolder); strcat(szFullStartFile, SFTC_SERVER_START_FILE); strcpy(szFullPythonFile, szStartingFolder); strcat(szFullPythonFile, SFTC_SERVER_PYTHON_FILE); strcpy(szFullPythonCommand, szStartingFolder); strcat(szFullPythonCommand, SFTC_SERVER_PYTHON_COMMAND); strcpy(szFullStartFolder, szStartingFolder); //strcat(szFullStartFolder, SFTC_SERVER_START_FOLDER); sprintf(szCommand,"%s %s -3 --pid=%s --slog=%s > %s", szFullPythonCommand, szFullPythonFile, szFullPidFile, szFullStartingLogFile, szFullLogFile ); /* NG sprintf(szCommand,"%s %s -3 --pid=%s --slog=%s", szFullPythonCommand, szFullPythonFile, szFullPidFile, szFullStartingLogFile //szFullLogFile ); */ /* ok sprintf(szCommand,"\"%s\" %s -3", szFullPythonCommand, szFullPythonFile //szFullPidFile, //szFullStartingLogFile //szFullLogFile ); */ nRetCode = isFileExist(szFullPidFile); if ( nRetCode ) { deleteFile(szFullPidFile); } nRetCode = isFileExist(szFullStartingLogFile); if ( nRetCode ) { deleteFile(szFullStartingLogFile); } nRetCode = isFileExist(szFullLogFile); if ( nRetCode ) { deleteFile(szFullLogFile); } // sprintf(szCommand,"%s", "cmd /K start C:\\DEFORM3D\\V6_0\\def_as.bat"); // sprintf(szFullPythonCommand,"cmd /K \"%s\"", szCommand); // semi ok sprintf(szCommand,"%s", "C:\\DEFORM3D\\V6_0\\def_as.bat"); /* NG sprintf(szCommand,"cmd /C \"%s %s -3\"", szFullPythonCommand, szFullPythonFile //szFullPidFile, //szFullStartingLogFile //szFullLogFile ); */ /* sprintf(szCommand,"cmd /K start /WAIT \"%s\"", szFullPythonCommand, szFullPythonFile //szFullPidFile, //szFullStartingLogFile //szFullLogFile ); */ /* args[0] = szCommand; _spawnv(_P_NOWAIT, args[0], args); */ /* system("C:\\DEFORM3D\\V6_0\\def_as.bat"); return 0; */ BOOL bSuccess = CreateProcess( NULL, #if 1 // 0 comment out szCommand, //szFullPythonCommand, //".\\PYTHON\\python.exe .\\COM\\server_queue_fem\\kernel\\sftc_server.py -3 --pid=.\\COM\\server_queue_fem\\config\\sftc_3d_win_app_server.pid > .\\COM\\server_queue_fem\\log\\server_running_log.txt", //"C:\\Shared\\nightly_build\\V80_USB\\source\\app_server\\DEF_ARM.exe", //"C:\\Shared\\nightly_build\\V80_USB\\source\\app_server\\DEF_ARM.com", #else // 0 comment RUN_SFTC_3D_APP_SERVICE, #endif // 0 comment out NULL, NULL, FALSE, DETACHED_PROCESS | CREATE_NO_WINDOW, /* TRUE, CREATE_NO_WINDOW, */ /* FALSE, CREATE_NEW_PROCESS_GROUP | CREATE_NO_WINDOW, //0, */ //DETACHED_PROCESS, //CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi ); if(bSuccess) { CloseHandle( pi.hThread ); h3DAppService = pi.hProcess; } return 0; } void KillService() { nServiceRunning=false; SetEvent(killServiceEvent); UpdateServiceStatus(SERVICE_STOPPED,NO_ERROR,0,0,0); if(h3DAppService) { TerminateProcess(h3DAppService, UINT(-1)); h3DAppService = NULL; } } void ServiceCtrlHandler(DWORD nControlCode) { BOOL success; switch(nControlCode) { case SERVICE_CONTROL_SHUTDOWN: case SERVICE_CONTROL_STOP: nServiceCurrentStatus=SERVICE_STOP_PENDING; success=UpdateServiceStatus( SERVICE_STOP_PENDING,NO_ERROR,0,1,3000); KillService(); return; default: break; } UpdateServiceStatus(nServiceCurrentStatus,NO_ERROR,0,0,0); } int isFileExist(const char * szFileName) { FILE * f; if ( !szFileName ) { return 0; } f=fopen(szFileName, "r"); if (f==NULL) { return 0; } else { fclose(f); return 1; } } int deleteFile(const char* pszFileName) { unlink(pszFileName); return 0; } ========== This email message and any attachments are for the sole use of the intended recipients and may contain proprietary and/or confidential information which may be privileged or otherwise protected from disclosure. Any unauthorized review, use, disclosure or distribution is prohibited. If you are not the intended recipients, please contact the sender by reply email and destroy the original message and any copies of the message as well as any attachments to the original message.