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?


Anmelden zum Antworten