- <pre name="code" class="delphi">program Project1;
-
-
- uses
- Windows,
- WinSvc;
-
-
- const
- ServiceName: pchar = ‘SnowWings Service‘;
- DisplayName: pchar = ‘Skysword‘;
- Description: pchar = ‘雪羽服务器控制台‘;
-
-
- var
- Status: TServiceStatus;
- StatusHandle: SERVICE_STATUS_HANDLE;
- ServiceTable: array [0 .. 1] of TServiceTableEntry;
- Stopped: boolean;
- Paused: boolean;
-
-
-
- procedure ServiceMain;
- begin
- repeat
- if not Paused then
- begin
-
- Sleep(1000);
- end;
- until Stopped;
- end;
-
-
- procedure ServiceCtrlHandler(Control: dword); stdcall;
- begin
- case Control of
- SERVICE_CONTROL_STOP:
- begin
- Stopped := True;
- Status.dwCurrentState := SERVICE_STOP_PENDING;
- SetServiceStatus(StatusHandle, Status);
- end;
- SERVICE_CONTROL_PAUSE:
- begin
- Paused := True;
- Status.dwCurrentState := SERVICE_PAUSED;
- SetServiceStatus(StatusHandle, Status);
- end;
- SERVICE_CONTROL_CONTINUE:
- begin
- Paused := False;
- Status.dwCurrentState := SERVICE_RUNNING;
- SetServiceStatus(StatusHandle, Status);
- end;
- SERVICE_CONTROL_INTERROGATE:
- SetServiceStatus(StatusHandle, Status);
- SERVICE_CONTROL_SHUTDOWN:
- Stopped := True;
- end;
- end;
-
-
- procedure ServiceCtrlDispatcher(dwArgc: dword; var lpszArgv: pchar); stdcall;
- begin
- StatusHandle := RegisterServiceCtrlHandler(ServiceName, @ServiceCtrlHandler);
- if StatusHandle <> 0 then
- begin
- ZeroMemory(@Status, SizeOf(Status));
- Status.dwServiceType := SERVICE_WIN32_OWN_PROCESS or
- SERVICE_INTERACTIVE_PROCESS;
- Status.dwCurrentState := SERVICE_START_PENDING;
- Status.dwControlsAccepted := SERVICE_ACCEPT_STOP or
- SERVICE_ACCEPT_PAUSE_CONTINUE;
- Status.dwWaitHint := 1000;
- SetServiceStatus(StatusHandle, Status);
- Stopped := False;
- Paused := False;
- Status.dwCurrentState := SERVICE_RUNNING;
- SetServiceStatus(StatusHandle, Status);
- ServiceMain;
- Status.dwCurrentState := SERVICE_STOPPED;
- SetServiceStatus(StatusHandle, Status);
- end;
- end;
-
-
- procedure UninstallService(ServiceName: pchar);
- var
- SCManager: SC_HANDLE;
- Service: SC_HANDLE;
- begin
- SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
- if SCManager = 0 then
- Exit;
- try
- Service := OpenService(SCManager, ServiceName, SERVICE_ALL_ACCESS);
- ControlService(Service, SERVICE_CONTROL_STOP, Status);
- DeleteService(Service);
- CloseServiceHandle(Service);
- finally
- CloseServiceHandle(SCManager);
- end;
- end;
-
-
- function SetServiceDescription(SH: THandle; Desc: pchar): Bool;
- const
- SERVICE_CONFIG_DESCRIPTION: dword = 1;
- var
- OSVersionInfo: TOSVersionInfo;
- ChangeServiceConfig2: function(hService: SC_HANDLE; dwInfoLevel: dword;
- lpInfo: Pointer): Bool; StdCall;
- LH: THandle;
- begin
- Result := False;
- OSVersionInfo.dwOSVersionInfoSize := SizeOf(OSVersionInfo);
- GetVersionEx(OSVersionInfo);
- if (OSVersionInfo.dwPlatformId = VER_PLATFORM_WIN32_NT) and
- (OSVersionInfo.dwMajorVersion >= 5) then
- begin
- LH := GetModuleHandle(advapi32);
- Result := LH <> 0;
- if not Result then
- Exit;
- ChangeServiceConfig2 := GetProcAddress(LH, ‘ChangeServiceConfig2A‘);
- Result := @ChangeServiceConfig2 <> nil;
- if not Result then
- Exit;
- Result := ChangeServiceConfig2(SH, SERVICE_CONFIG_DESCRIPTION, @Desc);
-
- end;
- end;
-
-
- procedure InstallService(ServiceName, DisplayName, Description: pchar;
- FileName: string);
- const
- SERVICE_CONFIG_DESCRIPTION: dword = 1;
- var
- SCManager: SC_HANDLE;
- Service: SC_HANDLE;
- Args: pchar;
- begin
- SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
- if SCManager = 0 then
- Exit;
- try
- Service := CreateService(SCManager, ServiceName, DisplayName,
- SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS or
- SERVICE_INTERACTIVE_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_IGNORE,
- pchar(FileName), nil, nil, nil, nil, nil);
- try
- SetServiceDescription(Service, Description);
- except
- end;
- Args := nil;
- StartService(Service, 0, Args);
- CloseServiceHandle(Service);
- finally
- CloseServiceHandle(SCManager);
- end;
- end;
-
-
- begin
- if ParamStr(1) = ‘/u‘ then
- begin
- UninstallService(ServiceName);
- end
- else
- begin
- ServiceTable[0].lpServiceName := ServiceName;
- ServiceTable[0].lpServiceProc := @ServiceCtrlDispatcher;
- ServiceTable[1].lpServiceName := nil;
- ServiceTable[1].lpServiceProc := nil;
- StartServiceCtrlDispatcher(ServiceTable[0]);
- InstallService(ServiceName, DisplayName, Description,
- pchar(ParamStr(0)));
- end;
-
-
- end.</pre><br>
- <br>
- <pre></pre>
- <br>
-
http://blog.csdn.net/warrially/article/details/8258911
Delphi 不使用自带模板创建服务
原文:http://www.cnblogs.com/findumars/p/6359756.html