Problem mit Windows-Dienst
-
Ich habe einen Dienst aus dem Internet kopiert, der nicht das tut, was er soll.
Er soll Piepen.
// Beeper Service.cpp // Copyright (c) 2001-2002 Jarmo Muukka. All rights reserved. #include <windows.h> #include <tchar.h> TCHAR* serviceName = TEXT("Beeper Service"); SERVICE_STATUS serviceStatus; SERVICE_STATUS_HANDLE serviceStatusHandle = 0; HANDLE stopServiceEvent = 0; void WINAPI ServiceControlHandler( DWORD controlCode ) { switch ( controlCode ) { case SERVICE_CONTROL_INTERROGATE: break; case SERVICE_CONTROL_SHUTDOWN: case SERVICE_CONTROL_STOP: serviceStatus.dwCurrentState = SERVICE_STOP_PENDING; SetServiceStatus( serviceStatusHandle, &serviceStatus ); SetEvent( stopServiceEvent ); return; case SERVICE_CONTROL_PAUSE: break; case SERVICE_CONTROL_CONTINUE: break; default: if ( controlCode >= 128 && controlCode <= 255 ) // user defined control code break; else // unrecognised control code break; } SetServiceStatus( serviceStatusHandle, &serviceStatus ); } void WINAPI ServiceMain( DWORD /*argc*/, TCHAR* /*argv*/[] ) { // initialise service status serviceStatus.dwServiceType = SERVICE_WIN32; serviceStatus.dwCurrentState = SERVICE_STOPPED; serviceStatus.dwControlsAccepted = 0; serviceStatus.dwWin32ExitCode = NO_ERROR; serviceStatus.dwServiceSpecificExitCode = NO_ERROR; serviceStatus.dwCheckPoint = 0; serviceStatus.dwWaitHint = 0; serviceStatusHandle = RegisterServiceCtrlHandler( serviceName, ServiceControlHandler ); if ( serviceStatusHandle ) { // service is starting serviceStatus.dwCurrentState = SERVICE_START_PENDING; SetServiceStatus( serviceStatusHandle, &serviceStatus ); // do initialisation here stopServiceEvent = CreateEvent( 0, FALSE, FALSE, 0 ); // running serviceStatus.dwControlsAccepted |= (SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN); serviceStatus.dwCurrentState = SERVICE_RUNNING; SetServiceStatus( serviceStatusHandle, &serviceStatus ); do { Beep( 1000, 100 ); //<<<<<<<<<<<<< WIESO GEHT DAS NICHT? } while ( WaitForSingleObject( stopServiceEvent, 5000 ) == WAIT_TIMEOUT ); // service was stopped serviceStatus.dwCurrentState = SERVICE_STOP_PENDING; SetServiceStatus( serviceStatusHandle, &serviceStatus ); // do cleanup here CloseHandle( stopServiceEvent ); stopServiceEvent = 0; // service is now stopped serviceStatus.dwControlsAccepted &= ~(SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN); serviceStatus.dwCurrentState = SERVICE_STOPPED; SetServiceStatus( serviceStatusHandle, &serviceStatus ); } } void RunService() { SERVICE_TABLE_ENTRY serviceTable[] = { { serviceName, ServiceMain }, { 0, 0 } }; StartServiceCtrlDispatcher( serviceTable ); } void InstallService() { SC_HANDLE serviceControlManager = OpenSCManager( 0, 0, SC_MANAGER_CREATE_SERVICE ); if ( serviceControlManager ) { TCHAR path[ _MAX_PATH + 1 ]; if ( GetModuleFileName( 0, path, sizeof(path)/sizeof(path[0]) ) > 0 ) { SC_HANDLE service = CreateService( serviceControlManager, serviceName, serviceName, SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_IGNORE, path, 0, 0, 0, 0, 0 ); if ( service ) CloseServiceHandle( service ); } CloseServiceHandle( serviceControlManager ); } } void UninstallService() { SC_HANDLE serviceControlManager = OpenSCManager( 0, 0, SC_MANAGER_CONNECT ); if ( serviceControlManager ) { SC_HANDLE service = OpenService( serviceControlManager, serviceName, SERVICE_QUERY_STATUS | DELETE ); if ( service ) { SERVICE_STATUS serviceStatus; if ( QueryServiceStatus( service, &serviceStatus ) ) { if ( serviceStatus.dwCurrentState == SERVICE_STOPPED ) DeleteService( service ); } CloseServiceHandle( service ); } CloseServiceHandle( serviceControlManager ); } } int _tmain( int argc, TCHAR* argv[] ) { if ( argc > 1 && lstrcmpi( argv[1], TEXT("install") ) == 0 ) { InstallService(); } else if ( argc > 1 && lstrcmpi( argv[1], TEXT("uninstall") ) == 0 ) { UninstallService(); } else { RunService(); } return 0; }Woran kann es liegen? Ich habe ihn ganz normal ausgeführt. Der Dienst läuft nicht. Ist also auf 'Beendet'.
Quelle:
http://www.muukka.net/programming/service/Beeper%20Service.cpp
-
Hab den Dienst nun Manuell gestartet, Beep() funktioniert aber weiterhin nicht.
-
Hi
Hast du Admin-Rechte ?
lowbyte
-
Bevor ich jetzt über den Code fliege, was steht im EventLog?!
-
lowbyte_ schrieb:
Hi
Hast du Admin-Rechte ?
lowbyte
Ja!
-
secondsun schrieb:
Bevor ich jetzt über den Code fliege, was steht im EventLog?!
??
lowbyte
-
Ich will wissen was im EventLog steht. Ist doch nicht so schwer oder?! Kann ja sein, dass der Dienst startet aber sofort wieder abgebrochen wird. Sollte es so sein, dann erhoffe ich mir eine bestimmte Fehlermeldung.
-
Der Dienst "Beeper Service" ist als interaktiver Dienst gekennzeichnet. Das System wurde jedoch so konfiguriert, dass interaktive Dienste nicht möglich sind. Der Dienst wird möglicherweise nicht richtig funktionieren.
steht da.
-
Hi
Ich meinte auch skullyan !
Mit dem wollte ich nur sagen, dass ich das auch gerne wissen möchte bevor da behauptungen aufgestellt werden.lowbyte
-
Okay und nun?
-
Tut mir leid^^ War nicht so gemeint.
Versuch mal in der Install Funktion das hier:
SC_HANDLE service = CreateService(serviceControlManager, serviceName, serviceName, SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, path, 0, 0, 0, 0, 0 );
-
Achso, und das solltest du auch noch mal versuchen(ServiceMain):
serviceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
-
Hat leider nichts geändert. Ach und mein OS ist Windows7 x64.
-
Dann versuch mal bitte deine Aktivitäten (Beep) usw. in einen seperaten Thread zu verschieben(was sowieso immer gemacht werden sollte).
-
Hat auch nicht funktioniert...
DWORD WINAPI BEEP() { while(true) { Beep(250,250); } } void WINAPI ServiceMain( DWORD /*argc*/, TCHAR* /*argv*/[] ) { // initialise service status serviceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; serviceStatus.dwCurrentState = SERVICE_STOPPED; serviceStatus.dwControlsAccepted = 0; serviceStatus.dwWin32ExitCode = NO_ERROR; serviceStatus.dwServiceSpecificExitCode = NO_ERROR; serviceStatus.dwCheckPoint = 0; serviceStatus.dwWaitHint = 0; serviceStatusHandle = RegisterServiceCtrlHandler( serviceName, ServiceControlHandler ); if ( serviceStatusHandle ) { // service is starting serviceStatus.dwCurrentState = SERVICE_START_PENDING; SetServiceStatus( serviceStatusHandle, &serviceStatus ); // do initialisation here stopServiceEvent = CreateEvent( 0, FALSE, FALSE, 0 ); // running serviceStatus.dwControlsAccepted |= (SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN); serviceStatus.dwCurrentState = SERVICE_RUNNING; SetServiceStatus( serviceStatusHandle, &serviceStatus ); CreateThread(0,0,LPTHREAD_START_ROUTINE(BEEP),0,0,0); do { Beep( 1000, 100 ); } while ( WaitForSingleObject( stopServiceEvent, 5000 ) == WAIT_TIMEOUT ); // service was stopped serviceStatus.dwCurrentState = SERVICE_STOP_PENDING; SetServiceStatus( serviceStatusHandle, &serviceStatus ); // do cleanup here CloseHandle( stopServiceEvent ); stopServiceEvent = 0; // service is now stopped serviceStatus.dwControlsAccepted &= ~(SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN); serviceStatus.dwCurrentState = SERVICE_STOPPED; SetServiceStatus( serviceStatusHandle, &serviceStatus ); } }Ich verzweilfe langsam..
-
Hi
CreateThread(0,0,LPTHREAD_START_ROUTINE(BEEP),0,0,0);Das sollte so aussehen :
DWORD WINAPI BEEP() { while(true) { Beep(250,250); } } CreateThread(0,0,BEEP,0,0,0);lowbyte
-
lowbyte_ schrieb:
Hi
CreateThread(0,0,LPTHREAD_START_ROUTINE(BEEP),0,0,0);Das sollte so aussehen :
DWORD WINAPI BEEP() { while(true) { Beep(250,250); } } CreateThread(0,0,BEEP,0,0,0);lowbyte
Normalerweise geht beides.
-
Hat es vlt. mit der Session 0 Isolation ab Vista zu tun?
-
Hmm..sehr komisch. Also dein Dienst läuft bei mir. Habe zwar auch Win7 aber nur 32Bit. Ich werde da aber nochmal nachhaken.. nteressiert mich nämlich auch;-)
-
secondsun schrieb:
Hmm..sehr komisch. Also dein Dienst läuft bei mir. Habe zwar auch Win7 aber nur 32Bit. Ich werde da aber nochmal nachhaken.. nteressiert mich nämlich auch;-)
Echt? Bei dir piept es?