<?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[[Erledigt] Shell Execute in Windows Service (Newbie :))]]></title><description><![CDATA[<p><strong>ERLEDIGT</strong></p>
<p>Hallo ich bin in C/C++ unbewandelt und möchte nun fragen ob jemand eine Ahnung hat wo der Fehler liegt? Ziel ist es einen Service einzurichten, der alle x Stunden (hier testweise mal alle 5 Sekunden) einen batch ausführt. Der Service lässt sich wunderbar installieren und starten. Wenn ich statt dem ShellExecute() ein Beep() verwende klappt das auch einwandfrei. Das Problem ist einfach dass die Batchdatei nicht ausgeführt wird, bzw. die log.txt nicht beschrieben wird.. Bitte um Hilfe <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Hier die Batchdatei</p>
<pre><code>REM C:\test.bat
dir &gt; log.txt
</code></pre>
<p>Hier mein Code</p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;
#include &lt;tchar.h&gt;
#include &lt;shellapi.h&gt;

TCHAR* serviceName = TEXT(&quot;Everest Report Service&quot;);
SERVICE_STATUS serviceStatus;
SERVICE_STATUS_HANDLE serviceStatusHandle = 0;
HANDLE stopServiceEvent = 0;

void WINAPI ServiceControlHandler( DWORD controlCode )
{
	switch ( controlCode )
	{
		case SERVICE_CONTROL_INTERROGATE:
			break;

		case SERVICE_CONTROL_SHUTDOWN:
		case SERVICE_CONTROL_STOP:
			serviceStatus.dwCurrentState = SERVICE_STOP_PENDING;
			SetServiceStatus( serviceStatusHandle, &amp;serviceStatus );

			SetEvent( stopServiceEvent );
			return;

		case SERVICE_CONTROL_PAUSE:
			break;

		case SERVICE_CONTROL_CONTINUE:
			break;

		default:
			if ( controlCode &gt;= 128 &amp;&amp; controlCode &lt;= 255 )
				// user defined control code
				break;
			else
				// unrecognised control code
				break;
	}

	SetServiceStatus( serviceStatusHandle, &amp;serviceStatus );
}

void WINAPI ServiceMain( DWORD /*argc*/, TCHAR* /*argv*/[] )
{
	// initialise service status
	serviceStatus.dwServiceType = SERVICE_WIN32;
	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, &amp;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, &amp;serviceStatus );

		do
		{               
			ShellExecute(0,&quot;open&quot;,&quot;C:\test.bat&quot;,0,0,SW_SHOW);
		}
		while ( WaitForSingleObject( stopServiceEvent, 5000 ) == WAIT_TIMEOUT );

		// service was stopped
		serviceStatus.dwCurrentState = SERVICE_STOP_PENDING;
		SetServiceStatus( serviceStatusHandle, &amp;serviceStatus );

		// do cleanup here
		CloseHandle( stopServiceEvent );
		stopServiceEvent = 0;

		// service is now stopped
		serviceStatus.dwControlsAccepted &amp;= ~(SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN);
		serviceStatus.dwCurrentState = SERVICE_STOPPED;
		SetServiceStatus( serviceStatusHandle, &amp;serviceStatus );
	}
}

void RunService()
{
	SERVICE_TABLE_ENTRY serviceTable[] =
	{
		{ serviceName, ServiceMain },
		{ 0, 0 }
	};

	StartServiceCtrlDispatcher( serviceTable );
}

void InstallService()
{
	SC_HANDLE serviceControlManager = OpenSCManager( 0, 0, SC_MANAGER_CREATE_SERVICE );

	if ( serviceControlManager )
	{
		TCHAR path[ _MAX_PATH + 1 ];
		if ( GetModuleFileName( 0, path, sizeof(path)/sizeof(path[0]) ) &gt; 0 )
		{
			SC_HANDLE service = CreateService( serviceControlManager,
							serviceName, serviceName,
							SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,
							SERVICE_AUTO_START, SERVICE_ERROR_IGNORE, path,
							0, 0, 0, 0, 0 );
			if ( service )
				CloseServiceHandle( service );
		}

		CloseServiceHandle( serviceControlManager );
	}
}

void UninstallService()
{
	SC_HANDLE serviceControlManager = OpenSCManager( 0, 0, SC_MANAGER_CONNECT );

	if ( serviceControlManager )
	{
		SC_HANDLE service = OpenService( serviceControlManager,
			serviceName, SERVICE_QUERY_STATUS | DELETE );
		if ( service )
		{
			SERVICE_STATUS serviceStatus;
			if ( QueryServiceStatus( service, &amp;serviceStatus ) )
			{
				if ( serviceStatus.dwCurrentState == SERVICE_STOPPED )
					DeleteService( service );
			}

			CloseServiceHandle( service );
		}

		CloseServiceHandle( serviceControlManager );
	}
}

int _tmain( int argc, TCHAR* argv[] )
{
	if ( argc &gt; 1 &amp;&amp; lstrcmpi( argv[1], TEXT(&quot;install&quot;) ) == 0 )
	{
		InstallService();
	}
	else if ( argc &gt; 1 &amp;&amp; lstrcmpi( argv[1], TEXT(&quot;uninstall&quot;) ) == 0 )
	{
		UninstallService();
	}
	else
	{
		RunService();
	}

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/119446/erledigt-shell-execute-in-windows-service-newbie</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 23:17:33 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/119446.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 01 Sep 2005 09:29:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [Erledigt] Shell Execute in Windows Service (Newbie :)) on Thu, 01 Sep 2005 10:02:16 GMT]]></title><description><![CDATA[<p><strong>ERLEDIGT</strong></p>
<p>Hallo ich bin in C/C++ unbewandelt und möchte nun fragen ob jemand eine Ahnung hat wo der Fehler liegt? Ziel ist es einen Service einzurichten, der alle x Stunden (hier testweise mal alle 5 Sekunden) einen batch ausführt. Der Service lässt sich wunderbar installieren und starten. Wenn ich statt dem ShellExecute() ein Beep() verwende klappt das auch einwandfrei. Das Problem ist einfach dass die Batchdatei nicht ausgeführt wird, bzw. die log.txt nicht beschrieben wird.. Bitte um Hilfe <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Hier die Batchdatei</p>
<pre><code>REM C:\test.bat
dir &gt; log.txt
</code></pre>
<p>Hier mein Code</p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;
#include &lt;tchar.h&gt;
#include &lt;shellapi.h&gt;

TCHAR* serviceName = TEXT(&quot;Everest Report Service&quot;);
SERVICE_STATUS serviceStatus;
SERVICE_STATUS_HANDLE serviceStatusHandle = 0;
HANDLE stopServiceEvent = 0;

void WINAPI ServiceControlHandler( DWORD controlCode )
{
	switch ( controlCode )
	{
		case SERVICE_CONTROL_INTERROGATE:
			break;

		case SERVICE_CONTROL_SHUTDOWN:
		case SERVICE_CONTROL_STOP:
			serviceStatus.dwCurrentState = SERVICE_STOP_PENDING;
			SetServiceStatus( serviceStatusHandle, &amp;serviceStatus );

			SetEvent( stopServiceEvent );
			return;

		case SERVICE_CONTROL_PAUSE:
			break;

		case SERVICE_CONTROL_CONTINUE:
			break;

		default:
			if ( controlCode &gt;= 128 &amp;&amp; controlCode &lt;= 255 )
				// user defined control code
				break;
			else
				// unrecognised control code
				break;
	}

	SetServiceStatus( serviceStatusHandle, &amp;serviceStatus );
}

void WINAPI ServiceMain( DWORD /*argc*/, TCHAR* /*argv*/[] )
{
	// initialise service status
	serviceStatus.dwServiceType = SERVICE_WIN32;
	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, &amp;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, &amp;serviceStatus );

		do
		{               
			ShellExecute(0,&quot;open&quot;,&quot;C:\test.bat&quot;,0,0,SW_SHOW);
		}
		while ( WaitForSingleObject( stopServiceEvent, 5000 ) == WAIT_TIMEOUT );

		// service was stopped
		serviceStatus.dwCurrentState = SERVICE_STOP_PENDING;
		SetServiceStatus( serviceStatusHandle, &amp;serviceStatus );

		// do cleanup here
		CloseHandle( stopServiceEvent );
		stopServiceEvent = 0;

		// service is now stopped
		serviceStatus.dwControlsAccepted &amp;= ~(SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN);
		serviceStatus.dwCurrentState = SERVICE_STOPPED;
		SetServiceStatus( serviceStatusHandle, &amp;serviceStatus );
	}
}

void RunService()
{
	SERVICE_TABLE_ENTRY serviceTable[] =
	{
		{ serviceName, ServiceMain },
		{ 0, 0 }
	};

	StartServiceCtrlDispatcher( serviceTable );
}

void InstallService()
{
	SC_HANDLE serviceControlManager = OpenSCManager( 0, 0, SC_MANAGER_CREATE_SERVICE );

	if ( serviceControlManager )
	{
		TCHAR path[ _MAX_PATH + 1 ];
		if ( GetModuleFileName( 0, path, sizeof(path)/sizeof(path[0]) ) &gt; 0 )
		{
			SC_HANDLE service = CreateService( serviceControlManager,
							serviceName, serviceName,
							SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,
							SERVICE_AUTO_START, SERVICE_ERROR_IGNORE, path,
							0, 0, 0, 0, 0 );
			if ( service )
				CloseServiceHandle( service );
		}

		CloseServiceHandle( serviceControlManager );
	}
}

void UninstallService()
{
	SC_HANDLE serviceControlManager = OpenSCManager( 0, 0, SC_MANAGER_CONNECT );

	if ( serviceControlManager )
	{
		SC_HANDLE service = OpenService( serviceControlManager,
			serviceName, SERVICE_QUERY_STATUS | DELETE );
		if ( service )
		{
			SERVICE_STATUS serviceStatus;
			if ( QueryServiceStatus( service, &amp;serviceStatus ) )
			{
				if ( serviceStatus.dwCurrentState == SERVICE_STOPPED )
					DeleteService( service );
			}

			CloseServiceHandle( service );
		}

		CloseServiceHandle( serviceControlManager );
	}
}

int _tmain( int argc, TCHAR* argv[] )
{
	if ( argc &gt; 1 &amp;&amp; lstrcmpi( argv[1], TEXT(&quot;install&quot;) ) == 0 )
	{
		InstallService();
	}
	else if ( argc &gt; 1 &amp;&amp; lstrcmpi( argv[1], TEXT(&quot;uninstall&quot;) ) == 0 )
	{
		UninstallService();
	}
	else
	{
		RunService();
	}

	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/862585</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/862585</guid><dc:creator><![CDATA[gringo]]></dc:creator><pubDate>Thu, 01 Sep 2005 10:02:16 GMT</pubDate></item><item><title><![CDATA[Reply to [Erledigt] Shell Execute in Windows Service (Newbie :)) on Thu, 01 Sep 2005 09:37:17 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>ich hab mir nur mal deinen ShellExecute angeschaut. Du must auf jeden Fall Backslashes in Stringliteralen verdoppeln, denn sonst bekommst du ein anderes Zeichen als Escapesequenz.</p>
<pre><code class="language-cpp">ShellExecute(0,&quot;open&quot;,&quot;C:\\test.bat&quot;,0,0,SW_SHOW);
</code></pre>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/862589</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/862589</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Thu, 01 Sep 2005 09:37:17 GMT</pubDate></item><item><title><![CDATA[Reply to [Erledigt] Shell Execute in Windows Service (Newbie :)) on Thu, 01 Sep 2005 09:52:54 GMT]]></title><description><![CDATA[<p>akari schrieb:</p>
<blockquote>
<p>Hallo</p>
<p>ich hab mir nur mal deinen ShellExecute angeschaut. Du must auf jeden Fall Backslashes in Stringliteralen verdoppeln, denn sonst bekommst du ein anderes Zeichen als Escapesequenz.</p>
<pre><code class="language-cpp">ShellExecute(0,&quot;open&quot;,&quot;C:\\test.bat&quot;,0,0,SW_SHOW);
</code></pre>
</blockquote>
<p>Danke aber das habe ich bereits versucht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/862600</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/862600</guid><dc:creator><![CDATA[gringo]]></dc:creator><pubDate>Thu, 01 Sep 2005 09:52:54 GMT</pubDate></item><item><title><![CDATA[Reply to [Erledigt] Shell Execute in Windows Service (Newbie :)) on Thu, 01 Sep 2005 10:03:23 GMT]]></title><description><![CDATA[<p>So habe es gelöst.<br />
ShellExecute muss folgendermassen aussehen:</p>
<pre><code class="language-cpp">ShellExecute(NULL, &quot;open&quot;, &quot;c:\\test.bat&quot;, NULL, NULL, SW_SHOWNORMAL);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/862607</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/862607</guid><dc:creator><![CDATA[gringo]]></dc:creator><pubDate>Thu, 01 Sep 2005 10:03:23 GMT</pubDate></item></channel></rss>