Dienst tut nicht wie ich will





  • Danke,

    aber diesen Link habe ich schon gefunden, mein problem ist dass ich nicht
    verstehe, was alles dazu gehört und wo ich anfangen soll.
    Daher: was muss in nem Programm stehen, damit es als Dienst läuft?
    Bitte etwas code und nicht immer diesen Link.
    Danke



  • oder anders gefragt:
    Wie kann ich einen Dienst schreiben, der Abhängig ist von irgendeiner Netzwerkomponente (bzw. -dienst)??
    bzw. wollte ich es jetzt mit dem SERVICE_INTERACTIVE_PROCESS - Flag probieren, aber da kann er mir dann keinen Dienst mehr erstellen!?
    Jemand Lösungsvorschläge??



  • @MisterX

    Ich hab mir das selber aus der MSDN zamkopiert!
    Also bringt dir mein Code nichts, da er ja sowieso in der MSDN gleich drin steht!
    -> [url] http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/service_programs.asp [/url]
    Unter diesem Link findest du genug Code - Beispiele die dir weiterhelfen.
    Solltest du durch die nicht weiter kommen, dann frag wieder nach!



  • Also, ich hab mir jetzt dies zusammenkopiert:

    #include <windows.h>
    #include <winsvc.h>
    #include <stdio.h>

    VOID MyServiceStart (DWORD argc, LPTSTR *argv);
    VOID MyServiceCtrlHandler (DWORD opcode);
    DWORD MyServiceInitialization (DWORD argc, LPTSTR *argv,
    DWORD *specificError);

    SERVICE_STATUS MyServiceStatus;
    SERVICE_STATUS_HANDLE MyServiceStatusHandle;

    DWORD MyServiceInitialization(DWORD argc, LPTSTR *argv,
    DWORD *specificError)
    {
    argv;
    argc;
    specificError;
    return(0);
    }

    VOID SvcDebugOut(LPSTR String, DWORD Status)
    {
    CHAR Buffer[1024];
    if (strlen(String) < 1000)
    {
    sprintf(Buffer, String, Status);
    OutputDebugStringA(Buffer);
    }
    }

    VOID MyServiceCtrlHandler (DWORD Opcode)
    {
    DWORD status;

    switch(Opcode)
    {
    case SERVICE_CONTROL_PAUSE:
    // Do whatever it takes to pause here.
    MyServiceStatus.dwCurrentState = SERVICE_PAUSED;
    break;

    case SERVICE_CONTROL_CONTINUE:
    // Do whatever it takes to continue here.
    MyServiceStatus.dwCurrentState = SERVICE_RUNNING;
    break;

    case SERVICE_CONTROL_STOP:
    // Do whatever it takes to stop here.
    MyServiceStatus.dwWin32ExitCode = 0;
    MyServiceStatus.dwCurrentState = SERVICE_STOPPED;
    MyServiceStatus.dwCheckPoint = 0;
    MyServiceStatus.dwWaitHint = 0;

    if (!SetServiceStatus (MyServiceStatusHandle,
    &MyServiceStatus))
    {
    status = GetLastError();
    SvcDebugOut(" [MY_SERVICE] SetServiceStatus error %ld\n",status);
    }

    SvcDebugOut(" [MY_SERVICE] Leaving MyService \n",0);
    return;

    case SERVICE_CONTROL_INTERROGATE:
    // Fall through to send current status.
    break;

    default:
    SvcDebugOut(" [MY_SERVICE] Unrecognized opcode %ld\n",
    Opcode);
    }

    // Send current status.
    if (!SetServiceStatus (MyServiceStatusHandle, &MyServiceStatus))
    {
    status = GetLastError();
    SvcDebugOut(" [MY_SERVICE] SetServiceStatus error%ld\n",status);
    }
    return;
    }

    void MyServiceStart (DWORD argc, LPTSTR *argv)
    {
    DWORD status;
    DWORD specificError;

    MyServiceStatus.dwServiceType = SERVICE_WIN32;
    MyServiceStatus.dwCurrentState = SERVICE_START_PENDING;
    MyServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP |
    SERVICE_ACCEPT_PAUSE_CONTINUE;
    MyServiceStatus.dwWin32ExitCode = 0;
    MyServiceStatus.dwServiceSpecificExitCode = 0;
    MyServiceStatus.dwCheckPoint = 0;
    MyServiceStatus.dwWaitHint = 0;

    MyServiceStatusHandle = RegisterServiceCtrlHandler(
    "MyService",
    MyServiceCtrlHandler); //////////////////////Erster fehler hier

    if (MyServiceStatusHandle == (SERVICE_STATUS_HANDLE)0)
    {
    SvcDebugOut(" [MY_SERVICE] RegisterServiceCtrlHandler failed %d\n", GetLastError());
    return;
    }

    // Initialization code goes here.
    status = MyServiceInitialization(argc,argv, &specificError);

    // Handle error condition
    if (status != NO_ERROR)
    {
    MyServiceStatus.dwCurrentState = SERVICE_STOPPED;
    MyServiceStatus.dwCheckPoint = 0;
    MyServiceStatus.dwWaitHint = 0;
    MyServiceStatus.dwWin32ExitCode = status;
    MyServiceStatus.dwServiceSpecificExitCode = specificError;

    SetServiceStatus (MyServiceStatusHandle, &MyServiceStatus);
    return;
    }

    // Initialization complete - report running status.
    MyServiceStatus.dwCurrentState = SERVICE_RUNNING;
    MyServiceStatus.dwCheckPoint = 0;
    MyServiceStatus.dwWaitHint = 0;

    if (!SetServiceStatus (MyServiceStatusHandle, &MyServiceStatus))
    {
    status = GetLastError();
    SvcDebugOut(" [MY_SERVICE] SetServiceStatus error %ld\n",status);
    }

    // This is where the service does its work.
    SvcDebugOut(" [MY_SERVICE] Returning the Main Thread \n",0);

    return;
    }

    // Stub initialization function.

    void Servicemain( )
    {
    SERVICE_TABLE_ENTRY DispatchTable[] =
    {
    { "MyService", MyServiceStart },
    { NULL, NULL } /////Zweiter fehler hier
    };

    if (!StartServiceCtrlDispatcher( DispatchTable))
    {
    SvcDebugOut(" [MY_SERVICE] StartServiceCtrlDispatcher error = %d\n", GetLastError());
    }
    }

    Als fehlermeldung erhalte ich:
    error C2664: 'RegisterServiceCtrlHandlerA' : Konvertierung des Parameters 2 von 'void (unsigned long)' in 'void (__stdcall *)(unsigned long)' nicht moeglich
    Keine Funktion mit diesem Namen im Gueltigkeitsbereich stimmt mit dem Zieltyp ueberein

    error C2440: 'initializing' : '' kann nicht in 'void (__stdcall *)(unsigned long,char ** )' konvertiert werden
    Keine Funktion mit diesem Namen im Gueltigkeitsbereich stimmt mit dem Zieltyp ueberein

    Was muss ich ändern?



  • Mensch Mädels, benutzt doch mal Code-Tags!!!

    Was muss ich ändern?

    Schreib

    [code type="C++" tabs="4"][ /code]
    

    um deinen Code herum! Herrgottnichnochmal...

    [ Dieser Beitrag wurde am 20.03.2003 um 19:40 Uhr von Hepi editiert. ]



  • Also, ich hab mir jetzt dies zusammenkopiert:
    [code type="C++" tabs="4"][ /code]

    #include <windows.h>
    #include <winsvc.h>
    #include <stdio.h>

    VOID MyServiceStart (DWORD argc, LPTSTR *argv);
    VOID MyServiceCtrlHandler (DWORD opcode);
    DWORD MyServiceInitialization (DWORD argc, LPTSTR *argv,
    DWORD *specificError);

    SERVICE_STATUS MyServiceStatus;
    SERVICE_STATUS_HANDLE MyServiceStatusHandle;

    DWORD MyServiceInitialization(DWORD argc, LPTSTR *argv,
    DWORD *specificError)
    {
    argv;
    argc;
    specificError;
    return(0);
    }

    VOID SvcDebugOut(LPSTR String, DWORD Status)
    {
    CHAR Buffer[1024];
    if (strlen(String) < 1000)
    {
    sprintf(Buffer, String, Status);
    OutputDebugStringA(Buffer);
    }
    }

    VOID MyServiceCtrlHandler (DWORD Opcode)
    {
    DWORD status;

    switch(Opcode)
    {
    case SERVICE_CONTROL_PAUSE:
    // Do whatever it takes to pause here.
    MyServiceStatus.dwCurrentState = SERVICE_PAUSED;
    break;

    case SERVICE_CONTROL_CONTINUE:
    // Do whatever it takes to continue here.
    MyServiceStatus.dwCurrentState = SERVICE_RUNNING;
    break;

    case SERVICE_CONTROL_STOP:
    // Do whatever it takes to stop here.
    MyServiceStatus.dwWin32ExitCode = 0;
    MyServiceStatus.dwCurrentState = SERVICE_STOPPED;
    MyServiceStatus.dwCheckPoint = 0;
    MyServiceStatus.dwWaitHint = 0;

    if (!SetServiceStatus (MyServiceStatusHandle,
    &MyServiceStatus))
    {
    status = GetLastError();
    SvcDebugOut(" [MY_SERVICE] SetServiceStatus error %ld\n",status);
    }

    SvcDebugOut(" [MY_SERVICE] Leaving MyService \n",0);
    return;

    case SERVICE_CONTROL_INTERROGATE:
    // Fall through to send current status.
    break;

    default:
    SvcDebugOut(" [MY_SERVICE] Unrecognized opcode %ld\n",
    Opcode);
    }

    // Send current status.
    if (!SetServiceStatus (MyServiceStatusHandle, &MyServiceStatus))
    {
    status = GetLastError();
    SvcDebugOut(" [MY_SERVICE] SetServiceStatus error%ld\n",status);
    }
    return;
    }

    void MyServiceStart (DWORD argc, LPTSTR *argv)
    {
    DWORD status;
    DWORD specificError;

    MyServiceStatus.dwServiceType = SERVICE_WIN32;
    MyServiceStatus.dwCurrentState = SERVICE_START_PENDING;
    MyServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP |
    SERVICE_ACCEPT_PAUSE_CONTINUE;
    MyServiceStatus.dwWin32ExitCode = 0;
    MyServiceStatus.dwServiceSpecificExitCode = 0;
    MyServiceStatus.dwCheckPoint = 0;
    MyServiceStatus.dwWaitHint = 0;

    MyServiceStatusHandle = RegisterServiceCtrlHandler(
    "MyService",
    MyServiceCtrlHandler); //////////////////////Erster fehler hier

    if (MyServiceStatusHandle == (SERVICE_STATUS_HANDLE)0)
    {
    SvcDebugOut(" [MY_SERVICE] RegisterServiceCtrlHandler failed %d\n", GetLastError());
    return;
    }

    // Initialization code goes here.
    status = MyServiceInitialization(argc,argv, &specificError);

    // Handle error condition
    if (status != NO_ERROR)
    {
    MyServiceStatus.dwCurrentState = SERVICE_STOPPED;
    MyServiceStatus.dwCheckPoint = 0;
    MyServiceStatus.dwWaitHint = 0;
    MyServiceStatus.dwWin32ExitCode = status;
    MyServiceStatus.dwServiceSpecificExitCode = specificError;

    SetServiceStatus (MyServiceStatusHandle, &MyServiceStatus);
    return;
    }

    // Initialization complete - report running status.
    MyServiceStatus.dwCurrentState = SERVICE_RUNNING;
    MyServiceStatus.dwCheckPoint = 0;
    MyServiceStatus.dwWaitHint = 0;

    if (!SetServiceStatus (MyServiceStatusHandle, &MyServiceStatus))
    {
    status = GetLastError();
    SvcDebugOut(" [MY_SERVICE] SetServiceStatus error %ld\n",status);
    }

    // This is where the service does its work.
    SvcDebugOut(" [MY_SERVICE] Returning the Main Thread \n",0);

    return;
    }

    // Stub initialization function.

    void Servicemain( )
    {
    SERVICE_TABLE_ENTRY DispatchTable[] =
    {
    { "MyService", MyServiceStart },
    { NULL, NULL } /////Zweiter fehler hier
    };

    if (!StartServiceCtrlDispatcher( DispatchTable))
    {
    SvcDebugOut(" [MY_SERVICE] StartServiceCtrlDispatcher error = %d\n", GetLastError());
    }
    }
    [code type="C++" tabs="4"][ /code]

    Als fehlermeldung erhalte ich:
    error C2664: 'RegisterServiceCtrlHandlerA' : Konvertierung des Parameters 2 von 'void (unsigned long)' in 'void (__stdcall *)(unsigned long)' nicht moeglich
    Keine Funktion mit diesem Namen im Gueltigkeitsbereich stimmt mit dem Zieltyp ueberein

    error C2440: 'initializing' : '' kann nicht in 'void (__stdcall *)(unsigned long,char ** )' konvertiert werden
    Keine Funktion mit diesem Namen im Gueltigkeitsbereich stimmt mit dem Zieltyp ueberein

    Was muss ich ändern?



  • Himmel hilf.....

    Ich geb's auf....

    [code type="C++" tabs="4"]HIER KOMMT DEIN CODE HIN!
    

    [/cpp]

    [ Dieser Beitrag wurde am 20.03.2003 um 19:56 Uhr von Hepi editiert. ]



  • @Hepi
    Du musst auch verstehen, dass manch Programmierer (oder auch "Möchtegern - Programmierer") noch nie in seinem Leben einen HTML - Code gesehen hat. **:-)**Deswegen gib nicht auf ...



  • ...aber lesen wird er doch können, oder? Und den blauen C++ CODE Button sieht man doch da unten, oder???

    #include <windows.h>
    #include <winsvc.h> 
    #include <stdio.h>
    
    VOID MyServiceStart (DWORD argc, LPTSTR *argv); 
    VOID MyServiceCtrlHandler (DWORD opcode); 
    DWORD MyServiceInitialization (DWORD argc, LPTSTR *argv, DWORD *specificError); 
    
    SERVICE_STATUS MyServiceStatus; 
    SERVICE_STATUS_HANDLE MyServiceStatusHandle; 
    
    DWORD MyServiceInitialization(DWORD argc, LPTSTR *argv, DWORD *specificError) 
    { 
        argv; 
        argc; 
        specificError; 
        return(0); 
    }
    
    VOID SvcDebugOut(LPSTR String, DWORD Status) 
    { 
        CHAR Buffer[1024]; 
        if (strlen(String) < 1000) 
        { 
            sprintf(Buffer, String, Status); 
            OutputDebugStringA(Buffer); 
        } 
    }
    
    VOID MyServiceCtrlHandler (DWORD Opcode) 
    { 
        DWORD status; 
    
        switch(Opcode) 
        { 
        case SERVICE_CONTROL_PAUSE: 
            // Do whatever it takes to pause here. 
            MyServiceStatus.dwCurrentState = SERVICE_PAUSED; 
            break; 
    
        case SERVICE_CONTROL_CONTINUE: 
            // Do whatever it takes to continue here. 
            MyServiceStatus.dwCurrentState = SERVICE_RUNNING; 
            break; 
    
        case SERVICE_CONTROL_STOP: 
            // Do whatever it takes to stop here. 
            MyServiceStatus.dwWin32ExitCode = 0; 
            MyServiceStatus.dwCurrentState = SERVICE_STOPPED; 
            MyServiceStatus.dwCheckPoint = 0; 
            MyServiceStatus.dwWaitHint = 0; 
    
            if (!SetServiceStatus (MyServiceStatusHandle, &MyServiceStatus))
            { 
                status = GetLastError(); 
                SvcDebugOut(" [MY_SERVICE] SetServiceStatus error %ld\n",status); 
            } 
            SvcDebugOut(" [MY_SERVICE] Leaving MyService \n",0); 
            return; 
    
        case SERVICE_CONTROL_INTERROGATE: 
            // Fall through to send current status. 
            break; 
    
        default: 
            SvcDebugOut(" [MY_SERVICE] Unrecognized opcode %ld\n", Opcode); 
        } 
        // Send current status. 
        if (!SetServiceStatus (MyServiceStatusHandle, &MyServiceStatus)) 
        { 
            status = GetLastError(); 
            SvcDebugOut(" [MY_SERVICE] SetServiceStatus error%ld\n",status); 
        } 
        return; 
    }
    
    void MyServiceStart (DWORD argc, LPTSTR *argv) 
    { 
        DWORD status; 
        DWORD specificError; 
    
        MyServiceStatus.dwServiceType = SERVICE_WIN32; 
        MyServiceStatus.dwCurrentState = SERVICE_START_PENDING; 
        MyServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE; 
        MyServiceStatus.dwWin32ExitCode = 0; 
        MyServiceStatus.dwServiceSpecificExitCode = 0; 
        MyServiceStatus.dwCheckPoint = 0; 
        MyServiceStatus.dwWaitHint = 0; 
    
        MyServiceStatusHandle = RegisterServiceCtrlHandler( "MyService", MyServiceCtrlHandler); //////////////////////Erster fehler hier
    
        if (MyServiceStatusHandle == (SERVICE_STATUS_HANDLE)0) 
        { 
            SvcDebugOut(" [MY_SERVICE] RegisterServiceCtrlHandler failed %d\n", GetLastError()); 
            return; 
        } 
    
        // Initialization code goes here. 
        status = MyServiceInitialization(argc,argv, &specificError); 
    
        // Handle error condition 
        if (status != NO_ERROR) 
        { 
            MyServiceStatus.dwCurrentState = SERVICE_STOPPED; 
            MyServiceStatus.dwCheckPoint = 0; 
            MyServiceStatus.dwWaitHint = 0; 
            MyServiceStatus.dwWin32ExitCode = status; 
            MyServiceStatus.dwServiceSpecificExitCode = specificError; 
    
            SetServiceStatus (MyServiceStatusHandle, &MyServiceStatus); 
            return; 
        } 
    
        // Initialization complete - report running status. 
        MyServiceStatus.dwCurrentState = SERVICE_RUNNING; 
        MyServiceStatus.dwCheckPoint = 0; 
        MyServiceStatus.dwWaitHint = 0; 
    
        if (!SetServiceStatus (MyServiceStatusHandle, &MyServiceStatus)) 
        { 
            status = GetLastError(); 
            SvcDebugOut(" [MY_SERVICE] SetServiceStatus error %ld\n",status); 
        } 
    
        // This is where the service does its work. 
        SvcDebugOut(" [MY_SERVICE] Returning the Main Thread \n",0); 
        return; 
    } 
    
    // Stub initialization function. 
    
    void Servicemain( ) 
    { 
        SERVICE_TABLE_ENTRY DispatchTable[] = 
        { 
            { "MyService", MyServiceStart }, 
            { NULL, NULL } /////Zweiter fehler hier
        }; 
    
        if (!StartServiceCtrlDispatcher( DispatchTable)) 
        { 
            SvcDebugOut(" [MY_SERVICE] StartServiceCtrlDispatcher error = %d\n", GetLastError()); 
        } 
    }
    

    UFF! Mann, Du schuldest mir was......


Anmelden zum Antworten