- When a service gets started, read the start parameters from the edit control and pass them to StartService.
- Disable the start parameter edit control while a service is running.
svn path=/trunk/; revision=53121
case ID_START:
{
- if (DoStart(Info))
+ if (DoStart(Info, NULL))
{
UpdateServiceStatus(Info->pCurrentService);
ChangeListViewText(Info, Info->pCurrentService, LVSTATUS);
case ID_RESTART:
if (DoStop(Info))
{
- DoStart(Info);
+ DoStart(Info, NULL);
UpdateServiceStatus(Info->pCurrentService);
ChangeListViewText(Info, Info->pCurrentService, LVSTATUS);
SetMenuAndButtonStates(Info);
BOOL CreateListView(PMAIN_WND_INFO Info);
/* start */
-BOOL DoStart(PMAIN_WND_INFO Info);
+BOOL DoStart(PMAIN_WND_INFO Info, LPWSTR lpStartParams);
/* stop */
typedef struct _STOP_INFO
EnableWindow (hButton, TRUE);
}
+ hButton = GetDlgItem(hwndDlg, IDC_START_PARAM);
+ EnableWindow(hButton, (State == SERVICE_STOPPED));
+
/* set the main toolbar */
SetMenuAndButtonStates(dlgInfo->Info);
}
}
+static
+VOID
+OnStart(HWND hwndDlg,
+ PSERVICEPROPSHEET dlgInfo)
+{
+ WCHAR szStartParams[256];
+ LPWSTR lpStartParams = NULL;
+
+ if (GetDlgItemText(hwndDlg, IDC_START_PARAM, szStartParams, 256) > 0)
+ lpStartParams = szStartParams;
+
+ if (DoStart(dlgInfo->Info, lpStartParams))
+ {
+ UpdateServiceStatus(dlgInfo->pService);
+ ChangeListViewText(dlgInfo->Info, dlgInfo->pService, LVSTATUS);
+ SetButtonStates(dlgInfo, hwndDlg);
+ SetServiceStatusText(dlgInfo, hwndDlg);
+ }
+}
+
+
/*
* General Property dialog callback.
* Controls messages to the General dialog
break;
case IDC_START:
- if (DoStart(dlgInfo->Info))
- {
- UpdateServiceStatus(dlgInfo->pService);
- ChangeListViewText(dlgInfo->Info, dlgInfo->pService, LVSTATUS);
- SetButtonStates(dlgInfo, hwndDlg);
- SetServiceStatusText(dlgInfo, hwndDlg);
- }
+ OnStart(hwndDlg, dlgInfo);
break;
case IDC_STOP:
static BOOL
DoStartService(PMAIN_WND_INFO Info,
- HWND hProgress)
+ HWND hProgress,
+ LPWSTR lpStartParams)
{
SC_HANDLE hSCManager;
SC_HANDLE hService;
DWORD dwMaxWait;
BOOL bRet = FALSE;
+ BOOL bWhiteSpace = TRUE;
+ LPWSTR lpChar;
+ DWORD dwArgsCount = 0;
+ LPCWSTR *lpArgsVector = NULL;
+
+ if (lpStartParams != NULL)
+ {
+ /* Count the number of arguments */
+ lpChar = lpStartParams;
+ while (*lpChar != 0)
+ {
+ if (iswspace(*lpChar))
+ {
+ bWhiteSpace = TRUE;
+ }
+ else
+ {
+ if (bWhiteSpace == TRUE)
+ {
+ dwArgsCount++;
+ bWhiteSpace = FALSE;
+ }
+ }
+
+ lpChar++;
+ }
+
+ /* Allocate the arguments vector and add one for the service name */
+ lpArgsVector = LocalAlloc(LMEM_FIXED, (dwArgsCount + 1) * sizeof(LPCWSTR));
+ if (!lpArgsVector)
+ return FALSE;
+
+ /* Make the service name the first argument */
+ lpArgsVector[0] = Info->pCurrentService->lpServiceName;
+
+ /* Fill the arguments vector */
+ dwArgsCount = 1;
+ bWhiteSpace = TRUE;
+ lpChar = lpStartParams;
+ while (*lpChar != 0)
+ {
+ if (iswspace(*lpChar))
+ {
+ *lpChar = 0;
+ bWhiteSpace = TRUE;
+ }
+ else
+ {
+ if (bWhiteSpace == TRUE)
+ {
+ lpArgsVector[dwArgsCount] = lpChar;
+ dwArgsCount++;
+ bWhiteSpace = FALSE;
+ }
+ }
+
+ lpChar++;
+ }
+ }
+
hSCManager = OpenSCManager(NULL,
NULL,
SC_MANAGER_CONNECT);
/* Start the service */
bRet = StartService(hService,
- 0,
- NULL);
+ dwArgsCount,
+ lpArgsVector);
if (!bRet && GetLastError() == ERROR_SERVICE_ALREADY_RUNNING)
{
/* If it's already running, just return TRUE */
CloseServiceHandle(hSCManager);
}
+ if (lpArgsVector)
+ LocalFree(lpArgsVector);
+
return bRet;
}
BOOL
-DoStart(PMAIN_WND_INFO Info)
+DoStart(PMAIN_WND_INFO Info, LPWSTR lpStartParams)
{
HWND hProgress;
BOOL bRet = FALSE;
InitializeProgressDialog(hProgress, Info->pCurrentService->lpServiceName);
/* Start the requested service */
- bRet = DoStartService(Info, hProgress);
+ bRet = DoStartService(Info, hProgress, lpStartParams);
/* Complete and destroy the progress bar */
DestroyProgressDialog(hProgress, bRet);