用delphi写了一个PC软件,能正常运行。现在想加入以服务方式启动,请问一下各位,如何实现服务启动呢,最好贴代码
解决方案 »
- 为什么简单的多线程会抛出EAccessViolation错误呢?
- 关于dbexpress 的几个漏洞 D2007,D2009
- DirectShow无法显示画面,只能刷新后才能闪动一下
- 请教一下我写的dll学习程序怎么会出错?
- TTable中,当TableName里含有空格时,怎么办??????
- update修改access数据库中的表,为什么总出现提示说“update有语法错误”?
- 在delphi中的TcomboBox控能像asp中的comboBox控件一样吗?
- 怎样才可以把JPG文件中的图片LOAD进一个CANVAS?
- 嗯,请帮助:)
- 请教:如何实现数据的分屏显示?
- 求助,用什么做GUIDE界面最简单,
- DevExQuantumGrid
unit WorkerThreadU;interfaceuses
System.Classes;type
TWorkerThread = class(TThread)
private
FPaused: Boolean; protected
procedure Execute; override;
public
procedure Pause;
procedure Continue;
end;implementationuses
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;interfaceuses
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;implementationuses
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文件,共有两个!