Problem mit Windows-Dienst



  • 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?



  • Hi

    Zuerst informiere Dich mal hier.

    http://msdn.microsoft.com/en-us/library/ms687098(v=VS.85).aspx
    http://msdn.microsoft.com/en-us/library/ms681928(v=VS.85).aspx

    int interaction(void)
    {
    
    	HWINSTA m_hWinsta;
    	HDESK m_hDesk;
    
    	/* Interaction -------------------------------------------- */
    
    	m_hWinsta = OpenWindowStation("winsta0", FALSE,
    								   WINSTA_ACCESSCLIPBOARD |
    								   WINSTA_ACCESSGLOBALATOMS |
    								   WINSTA_CREATEDESKTOP |
    								   WINSTA_ENUMDESKTOPS |
    								   WINSTA_ENUMERATE |
    								   WINSTA_EXITWINDOWS |
    								   WINSTA_READATTRIBUTES |
    								   WINSTA_READSCREEN |
    								   WINSTA_WRITEATTRIBUTES );
    
    	if(m_hWinsta == NULL) {
    		printf("error");
    		return 1;
    	}
    
    	SetProcessWindowStation(m_hWinsta);
    
    	m_hDesk = OpenInputDesktop( DF_ALLOWOTHERACCOUNTHOOK, FALSE,
    						   DESKTOP_CREATEMENU |
    						   DESKTOP_CREATEWINDOW |
    						   DESKTOP_ENUMERATE |
    						   DESKTOP_HOOKCONTROL |
    						   DESKTOP_JOURNALPLAYBACK |
    						   DESKTOP_JOURNALRECORD |
    						   DESKTOP_READOBJECTS |
    						   DESKTOP_SWITCHDESKTOP |
    						   DESKTOP_WRITEOBJECTS );
    
    	if(m_hDesk == NULL) {
    		printf("error");
    		return 1;
    	}
    
    	SetThreadDesktop(m_hDesk);
    
    	return 0;
    }
    

    lowbyte



  • Hab es nun mit nem anderen Code gelöst.

    Quelle:

    http://www.codeproject.com/KB/system/xyntservice.aspx

    (Sehr empfehlenswert)



  • Versuch mal ein Log-File einzubauen und dieses dann mit DebugAusgaben zu füttern.
    Sollte dein Code also ausgeführt werden wirst du es so erkennen(So eine Log-Datei ist wirklich eine lohnenswerte Zusatzklasse 🙂 ).
    Außerdem würde ich entweder einen Breakpoint setzen und Debuggen(Attach) oder für die faulen unter uns ein DebugBreak(); einfügen. 😃
    Sollte das System dort tatsächlich ankommen 🕶 - Ein Service hat von Natur aus einfach weniger Möglichkeiten (Schließlich startet derselbige ja auch schon mit dem System hoch) - deswegen mußt du dann ein wenig tricksen - dazu aber dann später mehr wenn du weißt ob das System dort ankommt.

    MfG
    Sönke


Anmelden zum Antworten