Общий подход таков: во-первых, получите идентификатор текущего процесса с помощью GetCurrentProcessId .Затем получите список всех запущенных служб с помощью EnumServicesStatusEx , чтобы проверить, соответствует ли pid текущему pid.
BOOL IsWindowsService()
{
LONG lRet = 0;
BOOL bRet = FALSE;
SC_HANDLE hSCM = NULL;
char *pBuf = NULL;
DWORD dwBufSize = 0;
DWORD dwBufNeed = 0;
DWORD dwNumberOfService = 0;
ENUM_SERVICE_STATUS_PROCESS *pServiceInfo = NULL;
hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ENUMERATE_SERVICE | SC_MANAGER_CONNECT);
if (NULL == hSCM)
{
printf("OpenSCManager error.\n");
return false;
}
EnumServicesStatusEx(hSCM, SC_ENUM_PROCESS_INFO, SERVICE_WIN32, SERVICE_STATE_ALL, NULL, dwBufSize, &dwBufNeed, &dwNumberOfService, NULL, NULL);
dwBufSize = dwBufNeed + sizeof(ENUM_SERVICE_STATUS_PROCESS);
pBuf = (char *)malloc(dwBufSize);
memset(pBuf, 0, dwBufSize);
bRet = EnumServicesStatusEx(hSCM, SC_ENUM_PROCESS_INFO, SERVICE_WIN32, SERVICE_STATE_ALL, (LPBYTE)pBuf, dwBufSize, &dwBufNeed, &dwNumberOfService, NULL, NULL);
if (bRet == FALSE)
{
printf("EnumServicesStatusEx error.\n");
::CloseServiceHandle(hSCM);
free(pBuf);
return false;
}
CloseServiceHandle(hSCM);
pServiceInfo = (LPENUM_SERVICE_STATUS_PROCESS)pBuf;
DWORD id = GetCurrentProcessId();
for (unsigned int i = 0; i < dwNumberOfService; i++)
{
if (pServiceInfo[i].ServiceStatusProcess.dwProcessId == id)
return true;
}
free(pBuf);
return false;
}