<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Problem mit dem Ausführen meines Programmes als Dienst]]></title><description><![CDATA[<p>Hi ich möchte mein Programm als Dienst laufen lassen.<br />
Dazu habe ich mir von CodeGuru folgende Source geholt und bereits modifiziert:</p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;

char service_name[]=&quot;Service1&quot;, display_name[]=&quot;Mein Service&quot;;

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],&quot;-i&quot;)==0) //-i ist der Parameter um den Service zu
 {                           //installieren
  if(InstallService()) return 1;
  else return -1;
 }
 if(strcmp(argv[1],&quot;-d&quot;)==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, &amp;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,&amp;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,&quot;\\Srv1.exe&quot;);          //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,&amp;status)==0) return false;

 if(status.dwCurrentState!=SERVICE_STOPPED)
  if(ControlService(hService,SERVICE_CONTROL_STOP,&amp;status)==0) return false;

 if(DeleteService(hService)==0)	return false;

 if(CloseServiceHandle(hService)==0) return false;
 else return true;
}
</code></pre>
<p>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.<br />
Habe schon alles mögliche ausprobiert aber ich finde den Fehler einfach nicht.<br />
Hoffe, dass ihr mir da helfen könnt den Fehler zu finden.</p>
<p>Danke schon mal für jegliche Hilfe.</p>
<p>Gruß<br />
rean</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/158724/problem-mit-dem-ausführen-meines-programmes-als-dienst</link><generator>RSS for Node</generator><lastBuildDate>Tue, 21 Jul 2026 14:45:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/158724.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 08 Sep 2006 03:21:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit dem Ausführen meines Programmes als Dienst on Fri, 08 Sep 2006 03:21:05 GMT]]></title><description><![CDATA[<p>Hi ich möchte mein Programm als Dienst laufen lassen.<br />
Dazu habe ich mir von CodeGuru folgende Source geholt und bereits modifiziert:</p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;

char service_name[]=&quot;Service1&quot;, display_name[]=&quot;Mein Service&quot;;

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],&quot;-i&quot;)==0) //-i ist der Parameter um den Service zu
 {                           //installieren
  if(InstallService()) return 1;
  else return -1;
 }
 if(strcmp(argv[1],&quot;-d&quot;)==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, &amp;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,&amp;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,&quot;\\Srv1.exe&quot;);          //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,&amp;status)==0) return false;

 if(status.dwCurrentState!=SERVICE_STOPPED)
  if(ControlService(hService,SERVICE_CONTROL_STOP,&amp;status)==0) return false;

 if(DeleteService(hService)==0)	return false;

 if(CloseServiceHandle(hService)==0) return false;
 else return true;
}
</code></pre>
<p>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.<br />
Habe schon alles mögliche ausprobiert aber ich finde den Fehler einfach nicht.<br />
Hoffe, dass ihr mir da helfen könnt den Fehler zu finden.</p>
<p>Danke schon mal für jegliche Hilfe.</p>
<p>Gruß<br />
rean</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1133386</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1133386</guid><dc:creator><![CDATA[rean]]></dc:creator><pubDate>Fri, 08 Sep 2006 03:21:05 GMT</pubDate></item></channel></rss>