a bother about windows service
-
Hi,all I have a windows service program with a service,and I can use "myservice/service" in cmd.exe,it sucess! then,I can see the service in control pane,I also can start up this service; But, this service can't run my code;:confused:why?? the whole code here void yourfunction() { for (int a =0; a<10; a++) ::MessageBoxA(NULL, "ggg", "ghgh" ,MB_OK); } SERVICE_STATUS ServiceStatus = { SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS, SERVICE_STOPPED, SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE | SERVICE_ACCEPT_PAUSE_CONTINUE, 0,0,0,0 }; TCHAR szSvName[]=TEXT("Myservice1"); SERVICE_STATUS_HANDLE hStatus; SC_HANDLE SCMger; void WINAPI ControlHandler(DWORD request); void ServiceMain(int argc, char* argv); void CreateMyService() { SCMger=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); CreateService( SCMger, szSvName, szSvName, SERVICE_START, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_IGNORE, TEXT("c:\\myservice1.exe"), NULL, NULL, NULL, NULL, NULL); } int main() { SERVICE_TABLE_ENTRY ServiceTable[2]; ServiceTable[0].lpServiceName = szSvName; ServiceTable[0].lpServiceProc=(LPSERVICE_MAIN_FUNCTION)ServiceMain; ServiceTable[1].lpServiceName = NULL; ServiceTable[1].lpServiceProc= NULL; if(StartServiceCtrlDispatcher(ServiceTable)==0)CreateMyService(); } //this fun also can't be debug,can't run void ServiceMain(int argc, char* argv) { hStatus = RegisterServiceCtrlHandler(szSvName,ControlHandler); ServiceStatus.dwCurrentState = SERVICE_START_PENDING; ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_SHUTDOWN; SetServiceStatus(hStatus,&ServiceStatus); ServiceStatus.dwWin32ExitCode = NO_ERROR; ServiceStatus.dwCheckPoint = 0; serviceStatus.dwWaitHint = 0; ServiceStatus.dwCurrentState = SERVICE_RUNNING; SetServiceStatus(hStatus,&ServiceStatus); yourfunction(); ServiceStatus.dwCurrentState = SERVICE_STOPPED; SetServiceStatus(hStatus,&ServiceStatus); } //this fun can't be debug,can't run void WINAPI ControlHandler(DWORD request) { switch(request) { case SERVICE_CONTROL_SHUTDOWN: ServiceStatus.dwCurrentState = SERVICE_STOPPED; SetServiceStatus(hStatus,&ServiceStatus); break; } }
-
Hi,all I have a windows service program with a service,and I can use "myservice/service" in cmd.exe,it sucess! then,I can see the service in control pane,I also can start up this service; But, this service can't run my code;:confused:why?? the whole code here void yourfunction() { for (int a =0; a<10; a++) ::MessageBoxA(NULL, "ggg", "ghgh" ,MB_OK); } SERVICE_STATUS ServiceStatus = { SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS, SERVICE_STOPPED, SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE | SERVICE_ACCEPT_PAUSE_CONTINUE, 0,0,0,0 }; TCHAR szSvName[]=TEXT("Myservice1"); SERVICE_STATUS_HANDLE hStatus; SC_HANDLE SCMger; void WINAPI ControlHandler(DWORD request); void ServiceMain(int argc, char* argv); void CreateMyService() { SCMger=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); CreateService( SCMger, szSvName, szSvName, SERVICE_START, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_IGNORE, TEXT("c:\\myservice1.exe"), NULL, NULL, NULL, NULL, NULL); } int main() { SERVICE_TABLE_ENTRY ServiceTable[2]; ServiceTable[0].lpServiceName = szSvName; ServiceTable[0].lpServiceProc=(LPSERVICE_MAIN_FUNCTION)ServiceMain; ServiceTable[1].lpServiceName = NULL; ServiceTable[1].lpServiceProc= NULL; if(StartServiceCtrlDispatcher(ServiceTable)==0)CreateMyService(); } //this fun also can't be debug,can't run void ServiceMain(int argc, char* argv) { hStatus = RegisterServiceCtrlHandler(szSvName,ControlHandler); ServiceStatus.dwCurrentState = SERVICE_START_PENDING; ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_SHUTDOWN; SetServiceStatus(hStatus,&ServiceStatus); ServiceStatus.dwWin32ExitCode = NO_ERROR; ServiceStatus.dwCheckPoint = 0; serviceStatus.dwWaitHint = 0; ServiceStatus.dwCurrentState = SERVICE_RUNNING; SetServiceStatus(hStatus,&ServiceStatus); yourfunction(); ServiceStatus.dwCurrentState = SERVICE_STOPPED; SetServiceStatus(hStatus,&ServiceStatus); } //this fun can't be debug,can't run void WINAPI ControlHandler(DWORD request) { switch(request) { case SERVICE_CONTROL_SHUTDOWN: ServiceStatus.dwCurrentState = SERVICE_STOPPED; SetServiceStatus(hStatus,&ServiceStatus); break; } }
who can help me?
-
who can help me?
?????
-
Hi,all I have a windows service program with a service,and I can use "myservice/service" in cmd.exe,it sucess! then,I can see the service in control pane,I also can start up this service; But, this service can't run my code;:confused:why?? the whole code here void yourfunction() { for (int a =0; a<10; a++) ::MessageBoxA(NULL, "ggg", "ghgh" ,MB_OK); } SERVICE_STATUS ServiceStatus = { SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS, SERVICE_STOPPED, SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE | SERVICE_ACCEPT_PAUSE_CONTINUE, 0,0,0,0 }; TCHAR szSvName[]=TEXT("Myservice1"); SERVICE_STATUS_HANDLE hStatus; SC_HANDLE SCMger; void WINAPI ControlHandler(DWORD request); void ServiceMain(int argc, char* argv); void CreateMyService() { SCMger=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS); CreateService( SCMger, szSvName, szSvName, SERVICE_START, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_IGNORE, TEXT("c:\\myservice1.exe"), NULL, NULL, NULL, NULL, NULL); } int main() { SERVICE_TABLE_ENTRY ServiceTable[2]; ServiceTable[0].lpServiceName = szSvName; ServiceTable[0].lpServiceProc=(LPSERVICE_MAIN_FUNCTION)ServiceMain; ServiceTable[1].lpServiceName = NULL; ServiceTable[1].lpServiceProc= NULL; if(StartServiceCtrlDispatcher(ServiceTable)==0)CreateMyService(); } //this fun also can't be debug,can't run void ServiceMain(int argc, char* argv) { hStatus = RegisterServiceCtrlHandler(szSvName,ControlHandler); ServiceStatus.dwCurrentState = SERVICE_START_PENDING; ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_SHUTDOWN; SetServiceStatus(hStatus,&ServiceStatus); ServiceStatus.dwWin32ExitCode = NO_ERROR; ServiceStatus.dwCheckPoint = 0; serviceStatus.dwWaitHint = 0; ServiceStatus.dwCurrentState = SERVICE_RUNNING; SetServiceStatus(hStatus,&ServiceStatus); yourfunction(); ServiceStatus.dwCurrentState = SERVICE_STOPPED; SetServiceStatus(hStatus,&ServiceStatus); } //this fun can't be debug,can't run void WINAPI ControlHandler(DWORD request) { switch(request) { case SERVICE_CONTROL_SHUTDOWN: ServiceStatus.dwCurrentState = SERVICE_STOPPED; SetServiceStatus(hStatus,&ServiceStatus); break; } }
When implementing a service, then it can be a good idea to make it react to a command-line parameter to control whether it should run as a service or as a standard console application. When needing to debug/test the service-functionality, then you just start it as a standard console application. There are serveral NT-Service wrappers, that makes it easy to implement the standard NT-service interface: http://www.naughter.com/serv.html[^] http://msdn.microsoft.com/en-us/library/bb540476.aspx[^] http://msdn.microsoft.com/en-us/library/ms810429.aspx[^]
-
When implementing a service, then it can be a good idea to make it react to a command-line parameter to control whether it should run as a service or as a standard console application. When needing to debug/test the service-functionality, then you just start it as a standard console application. There are serveral NT-Service wrappers, that makes it easy to implement the standard NT-service interface: http://www.naughter.com/serv.html[^] http://msdn.microsoft.com/en-us/library/bb540476.aspx[^] http://msdn.microsoft.com/en-us/library/ms810429.aspx[^]
:) thank you Snakefoot, I finish it;