Was passiert?



  • Wasnun schrieb:

    Wie realsiert man sowas in Windows?

    Als Service ➡ Beginner's introductory guide to writing, installing, starting, stopping NT services

    greetz, Swordfish



  • Swordfish schrieb:

    Wasnun schrieb:

    Wie realsiert man sowas in Windows?

    Als Service ➡ Beginner's introductory guide to writing, installing, starting, stopping NT services

    greetz, Swordfish

    Vielen Dank 🙂

    Ich habe nun folgendes geschrieben:

    SERVICE_TABLE_ENTRY ServiceTable[] = { { ServiceName, (LPSERVICE_MAIN_FUNCTION) ServiceMain },
    										 { NULL, NULL } };
    
    	if ( !StartServiceCtrlDispatcher( ServiceTable ) )
    	{
    		char Temp[1024 * 4];
    		sprintf( Temp, "%d", (LPCSTR) GetLastError ); // Liefert jedoch: 2089943857. Warum!?
    		MessageBox( NULL, Temp, "LOL", NULL );
    		return 1;
    	}
    

    Was bedeutet diese Fehlermeldung ich finde zu ihr leider nicht genügend Informationen. Und wie kann ich das ganze bitte beheben? Würde mich über eure Hilfe sehr freuen.

    Viele Grüße



  • Erstens: Deine Ausgabe liefert dir nur die Adresse der GetLastError()-Funktion (oder hast du die Klammern nur beim Abtippen vergessen?)

    Zweitens: Schau dir mal FormatMessage() an - das kann aus einer Fehlernummer eine lesbare Meldung erzeugen.



  • Also viel mehr helfen tut mir das nicht 😃 😃 😃

    Ich lache mich tot... Omgggggggggggggggggg... Haben die alle Humor lol lol

    Der Dienstprozess konnte keine Verbindung zum Dienstcontroller herstellen

    Top!!! Ne, danke soweit war ich dann doch schon L O L L OL

    Ihre Tastatur wurde nicht gefunden, bitte drücken sie F1 für weitere Hilfe HAHA



  • Hi !

    Wasnun schrieb:

    ..
    Ledier wird auch hierkein Dtor aufgerufen... 😞
    ...

    Ja, kein Wunder, keine Fensterklasse registriert und die Hauptnachrichtenschleife fehlt, das braucht Windoofie nun mal. 😉
    Oder hast du die hier ->

    // [...]
    

    versteckt, in deiner WinMain ?

    Was die Konsolenanwendung betrifft,
    hattu nicht gucki macht:

    SideWinder schrieb:

    Du wirst wohl oder Übel einen Handler installieren müssen der das im Notfall für dich übernimmt (wundert mich aber, dass das nicht automatisch passiert).
    Schau dir mal SetConsoleCtrlHandler() in der MSDN an.
    MfG SideWinder

    ?

    Check this out:

    #include <windows.h>
    #include <stdio.h>
    
    BOOL WINAPI CtrlHandler (DWORD dwEvent)
    {
        switch (dwEvent)
        {
    	   case CTRL_C_EVENT:
    			  printf("CTRL_C_EVENT\n");
    			  return 1;
    	   break;
    
    	   case CTRL_BREAK_EVENT:
                 printf("CTRL_BREAK_EVENT\n");
    			 return 1;
           break;
    
           case CTRL_LOGOFF_EVENT:
             printf(" CTRL_LOGOFF_EVENT\n");
    		   	 return 1;
           break;
    	  // Windows schickt Shutdown Nachricht ans Fenster, vor dem Runterfahren.
           case CTRL_SHUTDOWN_EVENT:
    	   {
    			puts("JJajaaaaa...Shutdown in 15 sekunden...");
    			Sleep(15000);
    			ExitProcess(0);
    	   }
          return 1;
    
    		  // Benutzer klickt Fenster zu, oder beendet im Taskmanager
           case CTRL_CLOSE_EVENT:
    					puts("Good Bye!");
    		//		ExitProcess(0);
           return 1;
    
           default: 
    		   	puts("Kenn ich nich, mach ich nich.");
    	   break;	
    					// Handled all known events
    	}
        return 1;
     } 
    
    int main()
    {
    	 SetConsoleCtrlHandler (CtrlHandler, 1);
    	 while(1){};
        return 0;
    }
    

    Gruhuuußßß p.



  • Hi,
    danke für deine Antwort 🙂 Inzwischen habe ich meine Anwendung auf Win32 umgestellt, jedoch läuft folgender Code nicht:

    #include <windows.h>
    #include <stdio.h>
    char *ServiceName = "Son komischer Test";
    HANDLE KillServiceEvent, ServiceThread;
    DWORD CurrentServiceStatus;
    bool ServiceRunning;
    SERVICE_STATUS_HANDLE ServiceStatusHandle;
    
    void ServiceMain( DWORD Argc, LPTSTR *Argv );
    bool StartServiceThread();
    DWORD ServiceExecutionThread( LPDWORD Param );
    void KillService();
    void ServiceCtrlHandler( DWORD nControlCode );
    bool UpdateServiceStatus( DWORD dwCurrentState, DWORD dwWin32ExitCode,
    						  DWORD dwServiceSpecificExitCode, DWORD dwCheckPoint,
    						  DWORD dwWaitHint );
    
    int WINAPI WinMain( HINSTANCE hInst, 
    					HINSTANCE hPrevInstance,
    					LPSTR lpCmdLine,
    					int nCmdShow ) 
    {
    	SERVICE_TABLE_ENTRY ServiceTable[] = { { ServiceName, (LPSERVICE_MAIN_FUNCTION) ServiceMain },
    										 { NULL, NULL } };
    
    	if ( !StartServiceCtrlDispatcher( ServiceTable ) ) // HIER HAPERTS!!!!!!!!!!!!! WARUM?
    	{
    		DWORD eNum;
    		TCHAR sysMsg[256];
    		TCHAR* p;
    
    		eNum = GetLastError( );
    		FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
    		NULL, eNum,
    		MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
    		sysMsg, 256, NULL );
    
    		p = sysMsg;
    		while( ( *p > 31 ) || ( *p == 9 ) )
    		++p;
    		do { *p-- = 0; } while( ( p >= sysMsg ) &&
    		( ( *p == '.' ) || ( *p < 33 ) ) );
    
    		MessageBox( NULL, sysMsg, "", NULL );
    
    		return 1;
    	}
    
    	return 0;
    }
    
    void ServiceMain( DWORD Argc, LPTSTR *Argv )
    {
    	ServiceStatusHandle = RegisterServiceCtrlHandler( ServiceName, (LPHANDLER_FUNCTION) ServiceCtrlHandler );
    	if ( !ServiceStatusHandle )
    		return;
    
    	if ( !UpdateServiceStatus( SERVICE_START_PENDING, NO_ERROR, 0, 1, 3000 ) )
    		return;
    
    	KillServiceEvent = CreateEvent(0, true, false, 0 );
    	if ( !KillServiceEvent )
    		return;
    
    	if ( !UpdateServiceStatus( SERVICE_START_PENDING, NO_ERROR, 0, 2, 1000 ) )
    		return;
    
    	if ( !StartServiceThread() )
    		return;
    
    	CurrentServiceStatus = SERVICE_RUNNING;
    	if ( !UpdateServiceStatus( CurrentServiceStatus, NO_ERROR, 0, 0, 0 ) )
    		return;
    
    	WaitForSingleObject( KillServiceEvent, INFINITE );
    	CloseHandle( KillServiceEvent );
    }
    
    bool StartServiceThread()
    {	
    	DWORD ThreadId;
    	ServiceThread = CreateThread( 0,
    								   0,
    								   (LPTHREAD_START_ROUTINE) ServiceExecutionThread,
    								   0,
    								   0,
    								   &ThreadId );
    	if( !ServiceThread )
    	{
    		return false;
    	}
    	else
    	{
    		ServiceRunning = true;
    		return true;
    	}
    }
    
    DWORD ServiceExecutionThread( LPDWORD Param )
    {
    	while( ServiceRunning )
    	{		
    		MessageBox( NULL, "Test-Service", "Service-Test", NULL );
    		Sleep( 4000 );
    	}
    	return 0;
    }
    
    void KillService()
    {
    	ServiceRunning = false;
    	SetEvent( KillServiceEvent );
    	UpdateServiceStatus( SERVICE_STOPPED, NO_ERROR, 0, 0, 0 );
    }
    
    void ServiceCtrlHandler( DWORD nControlCode )
    {
    	switch( nControlCode )
    	{	
    		case SERVICE_CONTROL_SHUTDOWN:
    		case SERVICE_CONTROL_STOP:
    			CurrentServiceStatus = SERVICE_STOP_PENDING;
    			UpdateServiceStatus( CurrentServiceStatus, NO_ERROR, 0, 1, 3000 );
    			KillService();		
    			return;
    
    		default:
    			break;
    	}
    
    	UpdateServiceStatus( CurrentServiceStatus, NO_ERROR, 0, 0, 0 );
    }
    
    bool UpdateServiceStatus( DWORD dwCurrentState, DWORD dwWin32ExitCode,
    						  DWORD dwServiceSpecificExitCode, DWORD dwCheckPoint,
    						  DWORD dwWaitHint )
    {
    	SERVICE_STATUS ServiceStatus;
    	ServiceStatus.dwServiceType		=	SERVICE_WIN32_OWN_PROCESS;
    	ServiceStatus.dwCurrentState	=	dwCurrentState;
    
    	if( dwCurrentState == SERVICE_START_PENDING )
    	{
    		ServiceStatus.dwControlsAccepted = 0;
    	}
    	else
    	{
    		ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
    	}
    
    	if( !dwServiceSpecificExitCode )
    	{
    		ServiceStatus.dwWin32ExitCode = dwWin32ExitCode;
    	}
    	else
    	{
    		ServiceStatus.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR;
    	}
    
    	ServiceStatus.dwServiceSpecificExitCode = dwServiceSpecificExitCode;
    	ServiceStatus.dwCheckPoint = dwCheckPoint;
    	ServiceStatus.dwWaitHint = dwWaitHint;
    
    	if ( !SetServiceStatus( ServiceStatusHandle, &ServiceStatus ) )
    	{
    		KillService();
    		return false;
    	}
    
    	return true;
    }
    

    Der Dienstprozess konnte keine Verbindung zum Dienstcontroller herstellen

    😞



  • Wasnun schrieb:

    Der Dienstprozess konnte keine Verbindung zum Dienstcontroller herstellen
    😞

    Die Fehlermeldung bekomme ich auch.

    Im Gegensatz zu deiner ServiceMain-Funktion steht in der MSDN das sie als
    VOID WINAPI
    deklariert werden soll, was jedoch das Problem nicht behebt.

    Desweiteren kenne ich mich mit dieser Dienstgeschichte nicht aus und mich da jetzt reinzufuchsen ist mir zu aufwendig.
    Dieser Link könnte dir weiterhelfen.
    http://www.codeproject.com/system/serviceskeleton.asp

    Mal am Rande, du willst doch nicht im Ernst einen Destruktor über einen Dienst aufrufen oder ?

    Gruß, p.



  • Nein, er will sein ganzes Programm hoffentlich als Dienst laufen haben, das ist hier optimal.

    Soll es doch eine Konsolenanwendung sein, sollte mein Vorschlag auf Seite 1 eigentlich funktionieren...

    MfG SideWinder



  • SideWinder schrieb:

    Nein, er will sein ganzes Programm hoffentlich als Dienst laufen haben, das ist hier optimal.

    Soll es doch eine Konsolenanwendung sein, sollte mein Vorschlag auf Seite 1 eigentlich funktionieren...

    MfG SideWinder

    Hi,
    also ich hatte erst an eine Konsolenanwendung gedacht, allerdings kommt die aufgrund des Fensters, dass nicht benötigt wird nicht in Frage. Wie man sieht ist mein Problem noch immer nicht gelöst... Hat nicht zufällig jemand ein vollständigen Code der mein Problem lösen könnte? Das Programm soll in eine Log-Datei schreiben, dieses wird über den Dtor erledigt. Die Endlosschleife ist zum ständigen Datenaustausch aufjedenfall notwendig!





  • Hilfffffffffffffffeeee schrieb:

    Hi,
    also ich hatte erst an eine Konsolenanwendung gedacht, allerdings kommt die aufgrund des Fensters, dass nicht benötigt wird nicht in Frage.

    Das Fenster kann man verstecken 😉



  • proggingmania schrieb:

    Hilfffffffffffffffeeee schrieb:

    Hi,
    also ich hatte erst an eine Konsolenanwendung gedacht, allerdings kommt die aufgrund des Fensters, dass nicht benötigt wird nicht in Frage.

    Das Fenster kann man verstecken 😉

    Das Prozess wird im Startprozess jedoch dennoch sichtbar sein 👎

    Fällt raus!



  • Das sieht mir hier nach Hacker-Kiddie aus !



  • Hilfffffffffffffffeeee schrieb:

    Das Prozess wird im Startprozess jedoch dennoch sichtbar sein 👎
    Fällt raus!

    Sie wollen Hacken ?
    Ihren Ausweis bitte !



  • Oh man, ihr l4m0r. Schreib nen Dienst, oder hooke EnumProcesses ()...


Anmelden zum Antworten