RetrieveAllServices 이함수에 메모장 Lines 보내시면 메모장에 서비스들 나열 됩니다.
Service Status 에 대한 것은 _SERVICE_STATUS 이 구조를 보시면되고
http://msdn.microsoft.com/en-us/library/windows/desktop/ms685996(v=vs.85).aspx
여기 보시만 아시겠죠?
ㅠㅠ.. 구글링하면 많이 나오네요...
#include <windows.h>
#include <iostream.h>
void ErrorDescription(DWORD p_dwError);
int RetrieveAllServices(TStrings *msgout)
{
SC_HANDLE hHandle = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (NULL == hHandle) {
ErrorDescription(GetLastError());
return -1;
}
else {
//cout << "Open SCM sucessfully" << endl;
msgout->Add("Open SCM successfully");
}
ENUM_SERVICE_STATUS service;
DWORD dwBytesNeeded = 0;
DWORD dwServicesReturned = 0;
DWORD dwResumedHandle = 0;
DWORD dwServiceType = SERVICE_WIN32 | SERVICE_DRIVER;
// Query services
BOOL retVal = EnumServicesStatus(hHandle, dwServiceType, SERVICE_STATE_ALL,
&service, sizeof(ENUM_SERVICE_STATUS), &dwBytesNeeded, &dwServicesReturned,
&dwResumedHandle);
if (!retVal) {
// Need big buffer
if (ERROR_MORE_DATA == GetLastError()) {
// Set the buffer
DWORD dwBytes = sizeof(ENUM_SERVICE_STATUS) + dwBytesNeeded;
ENUM_SERVICE_STATUS* pServices = NULL;
pServices = new ENUM_SERVICE_STATUS [dwBytes];
// Now query again for services
EnumServicesStatus(hHandle, SERVICE_WIN32 | SERVICE_DRIVER, SERVICE_STATE_ALL,
pServices, dwBytes, &dwBytesNeeded, &dwServicesReturned, &dwResumedHandle);
// now traverse each service to get information
for (unsigned iIndex = 0; iIndex < dwServicesReturned; iIndex++) {
msgout->Add(AnsiString("Display Name : ")+ (pServices + iIndex)->lpDisplayName);
msgout->Add(AnsiString("Service Name : ")+ (pServices + iIndex)->lpServiceName);
msgout->Add(AnsiString("Current Status : ")+ (pServices + iIndex)->ServiceStatus.dwCurrentState);
}
delete [] pServices;
pServices = NULL;
}
// there is any other reason
else {
ErrorDescription(GetLastError());
}
}
if (!CloseServiceHandle(hHandle)) {
ErrorDescription(GetLastError());
}
else {
//cout << "Close SCM sucessfully" << endl;
msgout->Add("Close SCM successfully");
}
return 0;
}
// get the description of error
void ErrorDescription(DWORD p_dwError) {
HLOCAL hLocal = NULL;
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,
NULL, p_dwError, MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),(LPTSTR)&hLocal,
0, NULL);
MessageBox(NULL, (LPCTSTR)LocalLock(hLocal), TEXT("Error"), MB_OK | MB_ICONERROR);
LocalFree(hLocal);
}
비베시러 님이 쓰신 글 :
: 안녕하세요
:
: 윈도우의 서비스로 구동되고 있는 list를 조회하고 싶습니다.
: (감시 프로그램을 만들고 싶어서요)
:
: 프로그램에서 특정 Process가 구동되는지 확인하고 싶은데요
:
: C#의 경우
:
: using System.ServiceProcess; 를 통해서
:
: ServiceController service in ServiceController.GetServices() 내에
:
: string serviceName = service.ServiceName; 으로 이름을 얻어 올 수 있고
:
: string status = service.Status.ToString(); 로 Run/Stop 상태까지 알수 있으나,
:
: C++ 빌더에서는 어떻게 해야 하는지 궁금합니다.
:
: 혹시 TProcess를 통해서 가능한지? 아시는분의 도움을 구합니다.
: 구글을 찾아봐도 마땅한 내용이 없어서 글 올립니다.
:
:
:
: