|
|
/////////////////////////////////////////////////////////////////////
//
// Progress.h
//
// Progress dialog to Start, Stop, Pause and Resume a service.
//
// HISTORY
// 03-Oct-95 t-danmo Creation of (sysmgmt\dsui\services\progress.cxx)
// 01-Oct-96 t-danmo Renaming of progress.cxx and adaptation to slate.
//
#define SERVICE_CONTROL_RESTART 10 // Stop and then Start the service
/////////////////////////////////////////////////////////////////////////////
class CServiceControlProgress { protected: enum { IDD = IDD_SERVICE_CONTROL_PROGRESS }; // Id of the dialog used
enum { ID_TIMER = 1 }; // Id of the timer
enum { dwTimerTickIncrement = 400 }; // Length of a timer tick (in milliseconds)
enum { dwTimerTimeout = 125000 }; // Timeout in milliseconds before aborting
enum { dwTimerProgressDone = 5000 }; // Estimate of time to complete the operation
protected: // Run-time UI variables
HWND m_hWndParent; // Parent window of the dialog box
HWND m_hctlActionMsg; // Handle of action static control
HWND m_hctlServiceNameMsg; // Handle of service name static control
HWND m_hctlProgress; // Handle of progress bar
UINT m_iServiceAction; // Index of action to take (start, stop, pause or resume)
UINT_PTR m_uTimerId; // Dynamic timer Id
UINT m_dwTimerTicks; // Number of milliseconds the timer has been ticking
// Variables needed for the threadproc
HANDLE m_hThread; HANDLE m_hEvent; BOOL m_fCanQueryStatus; DWORD m_dwQueryState; // Service state to query when pooling
SC_HANDLE m_hScManager; // Handle to service control manager database
SC_HANDLE m_hService; // Handle of the opened service
TCHAR m_szUiMachineName[256]; // Name of the computer in a friendly way
TCHAR m_szServiceName[256]; // Service name
TCHAR m_szServiceDisplayName[256]; // Display name of service
DWORD m_dwDesiredAccess; // Variables used by ::StartService()
DWORD m_dwNumServiceArgs; // Number of arguments
LPCTSTR * m_lpServiceArgVectors; // Address of array of argument string pointers
// Variables used by ::ControlService()
DWORD m_dwControlCode; // Control code
// Variables used by ::ControlService(SERVICE_CONTROL_STOP)
BOOL m_fPulseEvent; // TRUE => Call PulseEvent() instead of closing the dialog
BOOL m_fRestartService; // TRUE => Stop the service first, then start it again.
INT m_iDependentServiceIter; // Index of the current dependent service
INT m_cDependentServices; // Number of dependent services
ENUM_SERVICE_STATUS * m_pargDependentServicesT; // Allocated array of dependent services
ENUM_SERVICE_STATUS * m_pargServiceStop; // Allocated array of services to stop
APIERR m_dwLastError; // Error code from GetLastError()
public: CServiceControlProgress(); // Constructor
~CServiceControlProgress(); // Destructor
BOOL M_FInit( HWND hwndParent, SC_HANDLE hScManager, LPCTSTR pszMachineName, LPCTSTR pszServiceName, LPCTSTR pszServiceDisplayName); protected: BOOL M_FDlgStopDependentServices(); void M_UpdateDialogUI(LPCTSTR pszDisplayName); BOOL M_FGetNextService(OUT LPCTSTR * ppszServiceName, OUT LPCTSTR * ppszDisplayName); DWORD M_QueryCurrentServiceState();
APIERR M_EControlService(DWORD dwControlCode); APIERR M_EDoExecuteServiceThread(void * pThreadProc); void M_ProcessErrorCode(); void M_DoThreadCleanup();
protected: static DWORD S_ThreadProcStartService(CServiceControlProgress * pThis); static DWORD S_ThreadProcStopService(CServiceControlProgress * pThis); static DWORD S_ThreadProcPauseResumeService(CServiceControlProgress * pThis);
static BOOL CALLBACK S_DlgProcControlService(HWND hdlg, UINT uMsg, WPARAM wParam, LPARAM lParam); static BOOL CALLBACK S_DlgProcDependentServices(HWND hdlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
void M_OnInitDialog(HWND hdlg); void M_OnTimer(HWND hdlg);
public: enum // Error codes for variable m_dwLastError (arbitrary chosen)
{ errCannotInitialize = 123456, // Failed to initialize object
errUserCancelStopDependentServices, // User changed its mind (only used when stop service)
errUserAbort, // User aborted operation
};
static APIERR S_EStartService( HWND hwndParent, SC_HANDLE hScManager, LPCTSTR pszMachineName, LPCTSTR pszServiceName, LPCTSTR pszServiceDisplayName, DWORD dwNumServiceArgs, LPCTSTR * lpServiceArgVectors);
static APIERR S_EControlService( HWND hwndParent, SC_HANDLE hScManager, LPCTSTR pszMachineName, LPCTSTR pszServiceName, LPCTSTR pszServiceDisplayName, DWORD dwControlCode);
}; // CServiceControlProgress
|