忘了从哪抄的了: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);
}

解决方案 »

  1.   

    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 /
              \_/
      

  2.   

    Thank you seanzhao(新云) and plainsong(伤心的风) 
    I solved my problem with your suggestion.