Problem mit Windows-Dienst



  • 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