用delphi寫了一個PC軟體,能正常運行。現在想加入以服務方式啟動,請問一下各位,如何實作服務啟動呢,最好貼代碼
uj5u.com熱心網友回復:
直接寫成服務,如果有界面弄成服務,有點麻煩。uj5u.com熱心網友回復:
服務與桌面互動功能只有win 2k、xp、 server2003可以,之前的Windows NT、之后的Vista+都不支持,常規做法是服務啟動一個單獨的帶界面程式,用CreateProcessAsUser之類的uj5u.com熱心網友回復:
參考:https://docs.microsoft.com/zh-cn/windows/desktop/Services/interactive-servicesuj5u.com熱心網友回復:
那相當于兩個應用程式咯
uj5u.com熱心網友回復:
/// 這是執行緒單元/////////////////////////////////////unit WorkerThreadU;
interface
uses
System.Classes;
type
TWorkerThread = class(TThread)
private
FPaused: Boolean;
protected
procedure Execute; override;
public
procedure Pause;
procedure Continue;
end;
implementation
uses
System.SysUtils, System.ioutils;
procedure TWorkerThread.Continue;
begin
FPaused := False;
end;
procedure TWorkerThread.Execute;
var
ExePath, LogFileName: string;
Log: TStreamWriter;
begin
try
FPaused := False;
ExePath := TPath.GetDirectoryName(GetModuleName(HInstance));
LogFileName := TPath.Combine(ExePath,
ClassName + '_' + IntToStr(CurrentThread.ThreadID) + '.txt');
Log := TStreamWriter.Create(TFileStream.Create(LogFileName, fmCreate or fmShareDenyWrite));
try
while not Terminated do
begin
if not FPaused then
begin
Log.WriteLine('Message from thread: ' + TimeToStr(now));
end;
TThread.Sleep(1000);
end;
finally
Log.Free;
end;
except
on E: Exception do
begin
TFile.WriteAllText(TPath.Combine(ExePath, 'CRASH_LOG.TXT'), E.ClassName + ' ' + E.Message);
end
end;
end;
procedure TWorkerThread.Pause;
begin
FPaused := True;
end;
end.
///////////////////以下是服務單元///////////////////////////////////
unit ServiceU;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.SvcMgr, Vcl.Dialogs,
WorkerThreadU;
type
TSampleService = class(TService)
procedure ServiceExecute(Sender: TService);
procedure ServiceStart(Sender: TService; var Started: Boolean);
procedure ServiceStop(Sender: TService; var Stopped: Boolean);
procedure ServicePause(Sender: TService; var Paused: Boolean);
procedure ServiceContinue(Sender: TService; var Continued: Boolean);
procedure ServiceAfterInstall(Sender: TService);
private
FWorkerThread: TWorkerThread;
{ Private declarations }
public
function GetServiceController: TServiceController; override;
{ Public declarations }
end;
{$R *.dfm}
var
SampleService: TSampleService;
implementation
uses
System.Win.Registry;
procedure ServiceController(CtrlCode: DWord); stdcall;
begin
SampleService.Controller(CtrlCode);
end;
function TSampleService.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;
procedure TSampleService.ServiceAfterInstall(Sender: TService);
var
Reg: TRegistry;
begin
Reg := TRegistry.Create(KEY_READ or KEY_WRITE);
try
Reg.RootKey := HKEY_LOCAL_MACHINE;
if Reg.OpenKey('\SYSTEM\CurrentControlSet\Services\' + name, false) then
begin
Reg.WriteString('Description', 'My Fantastic Windows Service');
Reg.CloseKey;
end;
finally
Reg.Free;
end;
end;
procedure TSampleService.ServiceContinue(Sender: TService;
var Continued: Boolean);
begin
FWorkerThread.Continue;
Continued := True;
end;
procedure TSampleService.ServicePause(Sender: TService; var Paused: Boolean);
begin
FWorkerThread.Pause;
Paused := True;
end;
procedure TSampleService.ServiceStart(Sender: TService; var Started: Boolean);
begin
FWorkerThread := TWorkerThread.Create(True);
FWorkerThread.Start;
Started := True;
end;
procedure TSampleService.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
FWorkerThread.Terminate;
FWorkerThread.WaitFor;
FreeAndNil(FWorkerThread);
Stopped := True;
end;
procedure TSampleService.ServiceExecute(Sender: TService);
begin
while not Terminated do
begin
ServiceThread.ProcessRequests(false);
TThread.Sleep(1000);
end;
end;
end.
/////////////////以下是使用方法//////////////////
進 入系統命令列模式
切換到服務可執行檔案夾下,C:\<ExeProjectPath>\WindowsService.exe /install 進行安裝,成功后到服務視窗找到‘My Sample Service’,啟用。然后在C:\<ExeProjectPath>檔案夾有可以看到‘TWorkerThread‘’log檔案,共有兩個!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/27751.html
標籤:VCL組件開發及應用
下一篇:Delphi7中crystal reports11升級到Delphi10.2中crystal reports2016中代碼影響
