How can I enum all services installed on the system of Windows NT/W2K,
just as SCM did.
Thanks in advance
忘了从哪抄的了:
void CNetSearchDlg::CheckService(char * pHostName)
{
char sBuf[256];
UINT nCount = 1, nItemCount = 0;
ENUM_SERVICE_STATUS *lpSrv = (ENUM_SERVICE_STATUS *)malloc(sizeof(ENUM_SERVICE_STATUS));
DWORD dwNeeded = 0, dwSrvRet = 0, dwResumeHandle = 0;
dwResumeHandle = 0;
SC_HANDLE hSCManager = OpenSCManager(pHostName, NULL, GENERIC_READ);
int temp = GetLastError();
_retry_:
BOOL bRet = EnumServicesStatus(hSCManager,
SERVICE_WIN32, SERVICE_STATE_ALL, lpSrv, sizeof(ENUM_SERVICE_STATUS) * nCount,
&dwNeeded, &dwSrvRet, &dwResumeHandle);
for(UINT x = 0; x < dwSrvRet; x++)
{
nItemCount++;
CString strAux;
sprintf(sBuf,"%-30s : %s\n",lpSrv[x].lpDisplayName,lpSrv[x].lpServiceName);
m_list.InsertString(-1,sBuf);
}
if(!bRet)
{
int g_dwLastError = GetLastError();
if((g_dwLastError == ERROR_MORE_DATA) || (nCount * sizeof(ENUM_SERVICE_STATUS) < dwNeeded))
{
nCount++;
if(lpSrv)
{
lpSrv = (ENUM_SERVICE_STATUS *)realloc(lpSrv,
sizeof(ENUM_SERVICE_STATUS) * nCount);
if(!lpSrv)
goto _exit_;
}
else
{
lpSrv = (ENUM_SERVICE_STATUS *)malloc(sizeof(ENUM_SERVICE_STATUS) * nCount);
if(!lpSrv)
goto _exit_;
}
goto _retry_;
}
else
goto _exit_;
}
_exit_:
if(lpSrv)
free(lpSrv);
CloseServiceHandle(hSCManager);
}
BOOL EnumServicesStatus(
SC_HANDLE hSCManager, // handle to SCM database
DWORD dwServiceType, // service type
DWORD dwServiceState, // service state
LPENUM_SERVICE_STATUS lpServices, // status buffer
DWORD cbBufSize, // size of status buffer
LPDWORD pcbBytesNeeded, // buffer size needed
LPDWORD lpServicesReturned, // number of entries returned
LPDWORD lpResumeHandle // next entry
);
轻风又伤心了:2002-06-04
____ ____
\ p \ / g /
\ l \_/ n /
\ a o /
\ i s /
\ n /
\_/