I\'m writing a C application which creates a Windows service. I\'d like to check if the service is installed before trying to call the installation function, but I can\'t manage
If you need a yes / no answer whether a service is installed or note, use the following function:
bool IsServiceInstalled(LPWSTR ServiceName)
{
bool serviceInstalled = false;
SC_HANDLE scm_handle = OpenSCManager(0, 0, SC_MANAGER_CONNECT);
if (scm_handle)
{
SC_HANDLE service_handle = OpenService(scm_handle, ServiceName, SERVICE_INTERROGATE);
if (service_handle != NULL)
{
wprintf(L"Service Installed\n");
serviceInstalled = true;
CloseServiceHandle(service_handle);
}
else
{
wprintf(_T("OpenService failed - service not installed\n"));
}
CloseServiceHandle(scm_handle);
}
else
wprintf(_T("OpenService couldn't open - service not installed\n"));
return serviceInstalled;
}
A possibility would be to always attempt to CreateService() and if failure query GetLastError()
and check if it is equal to ERROR_SERVICE_EXISTS
:
SC_HANDLE service_handle = CreateService(...);
if (0 == service_handle)
{
if (ERROR_SERVICE_EXISTS == GetLastError())
{
/* Handle service already exists. */
}
else
{
/* Handle failure. */
}
}
This would require a slight change to your code from having two functions InstallService()
and CheckService()
to having one function (for example) EnsureServiceInstalled()
.
Or, you could use the OpenService() function, which will fail with GetLastError()
code of ERROR_SERVICE_DOES_NOT_EXIST
:
SC_HANDLE scm_handle = OpenSCManager(0, 0, GENERIC_READ);
if (scm_handle)
{
SC_HANDLE service_handle = OpenService(scm_handle,
"the-name-of-your-service",
GENERIC_READ);
if (!service_handle)
{
if (ERROR_SERVICE_DOES_NOT_EXIST != GetLastError())
{
fprintf(stderr,
"Failed to OpenService(): %d\n",
GetLastError());
}
else
{
/* Service does not exist. */
fprintf(stderr, "Service does not exist.\n");
}
}
else
{
fprintf(stderr, "Opened service.\n");
CloseServiceHandle(service_handle);
}
CloseServiceHandle(scm_handle);
}
else
{
fprintf(stderr,
"Failed to OpenSCManager(): %d\n",
GetLastError());
}