|
// *********************************************************
// リストボックスにサービス一覧を追加
// 戻り値 : 無し
// *********************************************************
void LboxEnumService( HWND hList, int nIndex, LPCTSTR szMachine )
{
SC_HANDLE sh;
sh = OpenSCManager(
szMachine,
NULL,
SC_MANAGER_ALL_ACCESS
);
if ( sh == NULL ) {
return;
}
BOOL bRet;
DWORD nSize;
DWORD nNeed;
DWORD nServiceCount;
DWORD nIdx;
LPENUM_SERVICE_STATUS lss;
DWORD i;
LPTSTR szBuffer,szData;
nSize = sizeof(ENUM_SERVICE_STATUS)+256*2+10;
szBuffer = new char[nSize];
szData = new char[1024];
nIdx = 0;
while( 1 ) {
bRet = EnumServicesStatus(
sh,
SERVICE_WIN32,
SERVICE_STATE_ALL,
(LPENUM_SERVICE_STATUS)szBuffer,
nSize,
&nNeed,
&nServiceCount,
&nIdx
);
if ( !bRet ) {
if ( GetLastError() != ERROR_MORE_DATA ) {
break;
}
}
for( i = 0; i < nServiceCount; i++ ) {
lss = (LPENUM_SERVICE_STATUS)
(szBuffer+sizeof(ENUM_SERVICE_STATUS)*i);
lstrcpy( szData, lss->lpDisplayName );
switch( lss->ServiceStatus.dwCurrentState ) {
case SERVICE_STOPPED:
wsprintf( szData+lstrlen(szData),
"\t%s", "STOPPED" );
break;
case SERVICE_START_PENDING:
wsprintf( szData+lstrlen(szData),
"\t%s", "START_PENDING" );
break;
case SERVICE_STOP_PENDING:
wsprintf( szData+lstrlen(szData),
"\t%s", "STOP_PENDING" );
break;
case SERVICE_RUNNING:
wsprintf( szData+lstrlen(szData),
"\t%s", "RUNNING" );
break;
case SERVICE_CONTINUE_PENDING:
wsprintf( szData+lstrlen(szData),
"\t%s", "CONTINUE_PENDING" );
break;
case SERVICE_PAUSE_PENDING:
wsprintf( szData+lstrlen(szData),
"\t%s", "PAUSE_PENDING" );
break;
case SERVICE_PAUSED:
wsprintf( szData+lstrlen(szData),
"\t%s", "PAUSED" );
break;
}
wsprintf( szData+lstrlen(szData), "\t%s", lss->lpServiceName );
LboxListInsert( hList, nIndex, szData );
nIndex++;
}
if ( nIdx == 0 ) {
break;
}
}
delete [] szData;
delete [] szBuffer;
CloseServiceHandle( sh );
}
| |