Problem mit dem Ausführen meines Programmes als Dienst



  • Hi ich möchte mein Programm als Dienst laufen lassen.
    Dazu habe ich mir von CodeGuru folgende Source geholt und bereits modifiziert:

    #include <windows.h>
    
    char service_name[]="Service1", display_name[]="Mein Service";
    
    SERVICE_STATUS m_ServiceStatus;
    SERVICE_STATUS_HANDLE m_ServiceStatusHandle;
    BOOL bRunning=true;
    
    void WINAPI ServiceMain(DWORD argc, LPTSTR *argv);
    void WINAPI ServiceCtrlHandler(DWORD Opcode);
    BOOL InstallService();
    BOOL DeleteService();
    
    int main(int argc, char* argv[])
    {
     if(strcmp(argv[1],"-i")==0) //-i ist der Parameter um den Service zu
     {                           //installieren
      if(InstallService()) return 1;
      else return -1;
     }
     if(strcmp(argv[1],"-d")==0) //-d um ihn zu deinstallieren
     {
      if(DeleteService()) return 2;
      else return -2;
     }
     SERVICE_TABLE_ENTRY DispatchTable[]={{service_name,(LPSERVICE_MAIN_FUNCTION)ServiceMain},
                                          {NULL,NULL}};
     StartServiceCtrlDispatcher( DispatchTable);
    
    return 0;
    }
    
    void WINAPI ServiceMain(DWORD argc, LPTSTR *argv)
    {
     DWORD status;
     DWORD specificError;
    
     m_ServiceStatus.dwServiceType        = SERVICE_WIN32;
     m_ServiceStatus.dwCurrentState       = SERVICE_START_PENDING;
     m_ServiceStatus.dwControlsAccepted   = SERVICE_ACCEPT_STOP;
     m_ServiceStatus.dwWin32ExitCode      = 0;
     m_ServiceStatus.dwServiceSpecificExitCode = 0;
     m_ServiceStatus.dwCheckPoint         = 0;
     m_ServiceStatus.dwWaitHint           = 0;
    
     m_ServiceStatusHandle = RegisterServiceCtrlHandler(service_name,ServiceCtrlHandler);
     if (m_ServiceStatusHandle == (SERVICE_STATUS_HANDLE)0) return;
    
     m_ServiceStatus.dwCurrentState       = SERVICE_RUNNING;
     m_ServiceStatus.dwCheckPoint         = 0;
     m_ServiceStatus.dwWaitHint           = 0;
     if (!SetServiceStatus (m_ServiceStatusHandle, &m_ServiceStatus))
     {
    
     }
    
     bRunning=true;
     while(bRunning)
     {
      Sleep(3000);
      //insert code here
     }
    return;
    }
    
    void WINAPI ServiceCtrlHandler(DWORD Opcode)
    {
        switch(Opcode)
        {
            case SERVICE_CONTROL_PAUSE:
                m_ServiceStatus.dwCurrentState = SERVICE_PAUSED;
                break;
    
            case SERVICE_CONTROL_CONTINUE:
                m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
                break;
    
            case SERVICE_CONTROL_STOP:
                m_ServiceStatus.dwWin32ExitCode = 0;
                m_ServiceStatus.dwCurrentState  = SERVICE_STOPPED;
                m_ServiceStatus.dwCheckPoint    = 0;
                m_ServiceStatus.dwWaitHint      = 0;
    
                SetServiceStatus (m_ServiceStatusHandle,&m_ServiceStatus);
    
    			bRunning=false;
    
    			break;
    
            case SERVICE_CONTROL_INTERROGATE:
                break;
        }
        return;
    }
    
    BOOL InstallService()
    {
     char strDir[MAX_PATH];
     HANDLE schSCManager,schService;
    
     GetCurrentDirectory(MAX_PATH,strDir); //Erstmal holen wir uns den Dateinamen
     strcat(strDir,"\\Srv1.exe");          //der exe
    
                    //öffnen des Servicemanagers. Wird für jeden Zugriff gebraucht
     schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
     if (schSCManager == NULL) return false;
    
     schService = CreateService(schSCManager,
            service_name,              // serivce name
            display_name,              // service name to display
            SERVICE_ALL_ACCESS,        // desired access
            SERVICE_WIN32_OWN_PROCESS, // service type
            SERVICE_AUTO_START,        // start type
            SERVICE_ERROR_NORMAL,      // error control type
            strDir,                    // path to exe-file
            NULL,                      // no load ordering group
            NULL,                      // no tag identifier
            NULL,                      // no dependencies
            NULL,                      // LocalSystem account
            NULL);                     // no password
    
     if (schService == NULL) return false;
    
     CloseServiceHandle(schService);
    
     return true;
    }
    
    BOOL DeleteService()
    {
     HANDLE schSCManager;
     SC_HANDLE hService;
     SERVICE_STATUS status;
    
     schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
    
     if (schSCManager == NULL)return false;
    
     hService=OpenService(schSCManager,service_name,SERVICE_ALL_ACCESS);
    
     if (hService == NULL)return false;
    
     if(QueryServiceStatus(hService,&status)==0) return false;
    
     if(status.dwCurrentState!=SERVICE_STOPPED)
      if(ControlService(hService,SERVICE_CONTROL_STOP,&status)==0) return false;
    
     if(DeleteService(hService)==0)	return false;
    
     if(CloseServiceHandle(hService)==0) return false;
     else return true;
    }
    

    Der Dienst wird auch offensichtlich korrekt installiert. Nach dem Starten des Dienstes wird die exe im Taskmanager angezeigt allerdings wird mein eingefügter Quelltext nicht ausgeführt.
    Habe schon alles mögliche ausprobiert aber ich finde den Fehler einfach nicht.
    Hoffe, dass ihr mir da helfen könnt den Fehler zu finden.

    Danke schon mal für jegliche Hilfe.

    Gruß
    rean


Anmelden zum Antworten