WIN API-VFP枚舉系統服務

 *--轉自:dkfdtf 大俠


#Define STANDARD_RIGHTS_REQUIRED 0x000F0000
#
Define
SC_MANAGER_ENUMERATE_SERVICE 0x0004
#
Define
SERVICE_WIN32 0x00000030
#
Define
SERVICE_STATE_ALL 0x00000003
#
Define
SERVICE_STOPPED 0x00000001
#
Define
SERVICE_START_PENDING 0x00000002
#
Define
SERVICE_STOP_PENDING 0x00000003
#
Define
SERVICE_RUNNING 0x00000004
#
Define
SERVICE_CONTINUE_PENDING 0x00000005
#
Define
SERVICE_PAUSE_PENDING 0x00000006
#
Define
SERVICE_PAUSED 0x00000007
Declare Long OpenSCManager In
WIN32API ;
    String lpMachineName, ;
&& pointer to machine name string
   
String lpDatabaseName, ;
&& pointer to database name string
   
Long dwDesiredAccess
&& type of access
Declare Long EnumServicesStatus In
WIN32API ;
   
Long hSCManager, ;
&& handle to service control manager database
   
Long dwServiceType, ;
&& type of services to enumerate
   
Long dwServiceState, ;
&& state of services to enumerate
   
String @ lpServices, ;
&& pointer to service status buffer
   
Long cbBufSize, ;
&& size of service status buffer
   
Long @ pcbBytesNeeded, ;
&& pointer to variable for bytes needed
   
Long @ lpServicesReturned, ;
&& pointer to variable for number returned
   
Long @ lpResumeHandle
&& pointer to variable for next entry
Declare Long CloseServiceHandle In
WIN32API ;
   
Long hSCObject
&& handle to service or service control manager database
Declare Long GetLastError In
WIN32API
Declare Long VarPtr In msvbvm60.Dll String
Pstr
 

Create Cursor svclist ( svcname C(20), dispname C(40), state C(8) )
 

m.hScm = OpenSCManager( Null, Null, Bitor( STANDARD_RIGHTS_REQUIRED, SC_MANAGER_ENUMERATE_SERVICE ))
If
( 0 == m.hScm )
    Insert Into svclist( svcname, dispname, state ) Values ( 'Error !', 'Open service control manager', Transform
( GetLastError()))
Else
   
m.cSSB = Replicate( Chr
(0), 64*1024 )
    m.iSvcRet = 0
   
If ( 0 == EnumServicesStatus( m.hScm, SERVICE_WIN32, SERVICE_STATE_ALL, @ m.cSSB, Len
( m.cSSB), 0, @ m.iSvcRet, 0 ))
       
Insert Into svclist( svcname, dispname, state ) Values ( 'Error !', 'Enumerates services', Transform
( GetLastError()))
   
Else
   
    *!* typedef struct _ENUM_SERVICE_STATUS { // ess
        *!* LPTSTR lpServiceName;
        *!* LPTSTR lpDisplayName;
        *!* SERVICE_STATUS ServiceStatus;
        *!* } ENUM_SERVICE_STATUS
        *!* typedef struct _SERVICE_STATUS {
        *!* DWORD dwServiceType;
        *!* DWORD dwCurrentState;
        *!* DWORD dwControlsAccepted;
        *!* DWORD dwWin32ExitCode;
        *!* DWORD dwServiceSpecificExitCode;
        *!* DWORD dwCheckPoint;
        *!* DWORD dwWaitHint;
        *!* } SERVICE_STATUS
       
For m.ii = 1 To
m.iSvcRet
            m.cESS =
Substr
( m.cSSB, 1+(m.ii-1)*36, 36 )
            m.iState =
CToBin( Substr
( m.cESS,13,4 ), 'rs' )
           
Insert Into svclist ( svcname, dispname, state ) Values ( GetString( Substr( m.cESS,1,4 ) ), GetString( Substr
( m.cESS,5,4 ) ), ;
               
Icase
( SERVICE_STOPPED == m.iState,'已停止', SERVICE_START_PENDING == m.iState,'啓動中', SERVICE_STOP_PENDING == m.iState,;
                '已停止', SERVICE_RUNNING == m.iState,'運行中', SERVICE_CONTINUE_PENDING == m.iState, '繼續中', ;
                SERVICE_PAUSE_PENDING == m.iState,'暫停中', SERVICE_PAUSED == m.iState, '已暫停', '未知狀態' ))
       
Endfor
    Endif
CloseServiceHandle( m.hScm )
Endif


Goto Top
Browse Name
m.oGrid Nowait
With
m.oGrid
As Grid
    .ReadOnly
= .T.
    .
AllowCellSelection
= .F.
    .
HighlightBackColor = Rgb
(0,64,128)
    .
HighlightForeColor = Rgb
( 255,255,255 )
    .
SetAll
( 'DynamicBackColor', 'IIF(1==RECNO()%2,RGB(255,243,243),RGB(255,255,255))' )
Endwith


Function
GetString( tcPtr )
    Local
cString
   
Try
       
m.cString = Sys( 2600, CToBin
( m.tcPtr, 'rs' ),512 )
   
Catch
       
m.cString=''
   
Endtry
    Return Left
( m.cString, At( Chr
(0), m.cString ) - 1 )
Endfunc
 

發佈了42 篇原創文章 · 獲贊 43 · 訪問量 37萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章