From a6b4f803dc151eda9c78f476f2c031f65b428450 Mon Sep 17 00:00:00 2001 From: Arnaud Bouchez Date: Mon, 9 May 2016 13:22:03 +0200 Subject: [PATCH] some enhancements to mORMotServices.pas unit - thanks Eric for the feedback! --- SQLite3/ServiceTestForm.pas | 1 - SQLite3/mORMotService.pas | 68 ++++++++++++++++++------------------- SynopseCommit.inc | 2 +- 3 files changed, 35 insertions(+), 36 deletions(-) diff --git a/SQLite3/ServiceTestForm.pas b/SQLite3/ServiceTestForm.pas index 3f36196ec..cb6add3b8 100644 --- a/SQLite3/ServiceTestForm.pas +++ b/SQLite3/ServiceTestForm.pas @@ -14,7 +14,6 @@ interface Dialogs, SynCrtSock, mORMot, - WinSvc, mORMotService; const diff --git a/SQLite3/mORMotService.pas b/SQLite3/mORMotService.pas index 8bbe158e1..8e8c40ca4 100644 --- a/SQLite3/mORMotService.pas +++ b/SQLite3/mORMotService.pas @@ -90,7 +90,7 @@ interface SynCommons, SynLog; -{ *** some minimal Windows API types and constants, missing for FPC } +{ *** some minimal Windows API definitions, replacing WinSvc.pas missing for FPC } const CM_SERVICE_CONTROL_CODE = WM_USER+1000; @@ -176,6 +176,37 @@ TServiceTableEntry = record lpServiceProc: TFarProc; end; +function OpenSCManager(lpMachineName, lpDatabaseName: PChar; + dwDesiredAccess: DWORD): SC_HANDLE; stdcall; external advapi32 + name 'OpenSCManager'+{$ifdef UNICODE}'W'{$else}'A'{$endif}; +function ChangeServiceConfig2(hService: SC_HANDLE; dwsInfoLevel: DWORD; + lpInfo: Pointer): BOOL; stdcall; external advapi32 name 'ChangeServiceConfig2W'; +function StartService(hService: SC_HANDLE; dwNumServiceArgs: DWORD; + lpServiceArgVectors: Pointer): BOOL; stdcall; external advapi32 + name 'StartService'+{$ifdef UNICODE}'W'{$else}'A'{$endif}; +function CreateService(hSCManager: SC_HANDLE; lpServiceName, lpDisplayName: PChar; + dwDesiredAccess, dwServiceType, dwStartType, dwErrorControl: DWORD; + lpBinaryPathName, lpLoadOrderGroup: PChar; lpdwTagId: LPDWORD; lpDependencies, + lpServiceStartName, lpPassword: PChar): SC_HANDLE; stdcall; external advapi32 + name 'CreateService'+{$ifdef UNICODE}'W'{$else}'A'{$endif}; +function OpenService(hSCManager: SC_HANDLE; lpServiceName: PChar; + dwDesiredAccess: DWORD): SC_HANDLE; stdcall; external advapi32 + name 'OpenService'+{$ifdef UNICODE}'W'{$else}'A'{$endif}; +function DeleteService(hService: SC_HANDLE): BOOL; stdcall; external advapi32; +function CloseServiceHandle(hSCObject: SC_HANDLE): BOOL; stdcall; external advapi32; +function QueryServiceStatus(hService: SC_HANDLE; + var lpServiceStatus: TServiceStatus): BOOL; stdcall; external advapi32; +function ControlService(hService: SC_HANDLE; dwControl: DWORD; + var lpServiceStatus: TServiceStatus): BOOL; stdcall; external advapi32; +function SetServiceStatus(hServiceStatus: SERVICE_STATUS_HANDLE; + var lpServiceStatus: TServiceStatus): BOOL; stdcall; external advapi32; +function RegisterServiceCtrlHandler(lpServiceName: PChar; + lpHandlerProc: TFarProc): SERVICE_STATUS_HANDLE; stdcall; external advapi32 + name 'RegisterServiceCtrlHandler'+{$ifdef UNICODE}'W'{$else}'A'{$endif}; +function StartServiceCtrlDispatcher( + var lpServiceStartTable: TServiceTableEntry): BOOL; stdcall; external advapi32 + name 'StartServiceCtrlDispatcher'+{$ifdef UNICODE}'W'{$else}'A'{$endif}; + { *** high level classes to define and manage Windows Services } @@ -488,37 +519,6 @@ function ServiceStateText(State: TServiceState): string; implementation -function OpenSCManager(lpMachineName, lpDatabaseName: PChar; - dwDesiredAccess: DWORD): SC_HANDLE; stdcall; external advapi32 - name 'OpenSCManager'+{$ifdef UNICODE}'W'{$else}'A'{$endif}; -function ChangeServiceConfig2(hService: SC_HANDLE; dwsInfoLevel: DWORD; - lpInfo: Pointer): BOOL; stdcall; external advapi32 name 'ChangeServiceConfig2W'; -function StartService(hService: SC_HANDLE; dwNumServiceArgs: DWORD; - lpServiceArgVectors: Pointer): BOOL; stdcall; external advapi32 - name 'StartService'+{$ifdef UNICODE}'W'{$else}'A'{$endif}; -function CreateService(hSCManager: SC_HANDLE; lpServiceName, lpDisplayName: PChar; - dwDesiredAccess, dwServiceType, dwStartType, dwErrorControl: DWORD; - lpBinaryPathName, lpLoadOrderGroup: PChar; lpdwTagId: LPDWORD; lpDependencies, - lpServiceStartName, lpPassword: PChar): SC_HANDLE; stdcall; external advapi32 - name 'CreateService'+{$ifdef UNICODE}'W'{$else}'A'{$endif}; -function OpenService(hSCManager: SC_HANDLE; lpServiceName: PChar; - dwDesiredAccess: DWORD): SC_HANDLE; stdcall; external advapi32 - name 'OpenService'+{$ifdef UNICODE}'W'{$else}'A'{$endif}; -function DeleteService(hService: SC_HANDLE): BOOL; stdcall; external advapi32; -function CloseServiceHandle(hSCObject: SC_HANDLE): BOOL; stdcall; external advapi32; -function QueryServiceStatus(hService: SC_HANDLE; - var lpServiceStatus: TServiceStatus): BOOL; stdcall; external advapi32; -function ControlService(hService: SC_HANDLE; dwControl: DWORD; - var lpServiceStatus: TServiceStatus): BOOL; stdcall; external advapi32; -function SetServiceStatus(hServiceStatus: SERVICE_STATUS_HANDLE; - var lpServiceStatus: TServiceStatus): BOOL; stdcall; external advapi32; -function RegisterServiceCtrlHandler(lpServiceName: PChar; - lpHandlerProc: TFarProc): SERVICE_STATUS_HANDLE; stdcall; external advapi32 - name 'RegisterServiceCtrlHandler'+{$ifdef UNICODE}'W'{$else}'A'{$endif}; -function StartServiceCtrlDispatcher( - var lpServiceStartTable: TServiceTableEntry): BOOL; stdcall; external advapi32 - name 'StartServiceCtrlDispatcher'+{$ifdef UNICODE}'W'{$else}'A'{$endif}; - { TServiceController } @@ -613,7 +613,7 @@ destructor TServiceController.Destroy; function TServiceController.GetState: TServiceState; begin if (self=nil) or (FSCHandle=0) or (FHandle=0) then - result := ssErrorRetrievingState else + result := ssNotInstalled else result := CurrentStateToServiceState(Status.dwCurrentState); ServiceLog.Add.Log(sllTrace,FName,TypeInfo(TServiceState),result); end; @@ -737,7 +737,7 @@ function FindServiceIndex(const Name: String): integer; begin if Services<>nil then for result := 0 to Services.Count-1 do - if TService(Services[result]).ServiceName=Name then + if TService(Services.List[result]).ServiceName=Name then exit; result := -1; end; diff --git a/SynopseCommit.inc b/SynopseCommit.inc index d766ebb09..3e4c68f96 100644 --- a/SynopseCommit.inc +++ b/SynopseCommit.inc @@ -1 +1 @@ -'1.18.2635' +'1.18.2636'