首先在Delphi 7中开始我自己的服务。跟随文档,使服务产生一个自定义的线程,哔哔声和日志。 只有它不。 最后一次尝试是把相同的嘟嘟声和日志代码放在OnExecute事件过程中,但是当我启动服务时,我得到一个Windows对话框,说它已经启动,然后再次停止。
这个代码中应该有一些我忽略的东西。
你能看看吗? 我也会接受简单的,可用的,可下载的服务示例项目的链接,只要我每隔10秒钟就能得到一些东西,我就可以从那里获取。
有关创建服务的详细信息,请参阅http://www.delphi3000.com/articles/article_3379.asp 。 我几年前做了这个职位,但仍然应该工作。
一个简单的骨骼服务应用程序如下。
请注意,如果您想使用ServiceApp.exe / install在Windows Vista及更高版本上安装该服务,则必须确保以管理员权限运行该应用程序。
另请注意,尽管fmShareDenyWrite在服务运行时可能无法查看日志文件的内容。 至少我不能使用记事本++打开文件,直到我停止服务。 这可能与我使用系统帐户(而不是我自己的用户帐户)运行的服务有关。
另一个说法:如果你想让你的服务暂停和继续,不要使用暂停和恢复。 它们不是线程安全的并且在D2010 +中已被弃用。 使用T(简单)事件或类似的东西来控制主工作线程的执行。 如果您不想让服务暂停并继续,则可以简单地将AllowPause设置为False。
unit ServiceApp_fm; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs; type TService1 = class(TService) procedure ServiceStart(Sender: TService; var Started: Boolean); procedure ServiceStop(Sender: TService; var Stopped: Boolean); private FWorker: TThread; public function GetServiceController: TServiceController; override; end; var Service1: TService1; implementation {$R *.DFM} type TMainWorkThread = class(TThread) private {$IFDEF UNICODE} FLog: TStreamWriter; {$ELSE} FLog: TFileStream; {$ENDIF} FRepetition: Cardinal; public constructor Create; destructor Destroy; override; procedure Execute; override; end; procedure ServiceController(CtrlCode: DWord); stdcall; begin Service1.Controller(CtrlCode); end; function TService1.GetServiceController: TServiceController; begin Result := ServiceController; end; procedure TService1.ServiceStart(Sender: TService; var Started: Boolean); begin FWorker := TMainWorkThread.Create; Started := True; end; procedure TService1.ServiceStop(Sender: TService; var Stopped: Boolean); begin // Thread should be freed as well as terminated so we don't have a memory // leak. Use FreeAndNil so we can also recognize when the thread isn't // available. (When the service has been stopped but the process hasn't ended // yet or may not even end when the service is restarted instead of "just" stopped. if FWorker <> nil then begin FWorker.Terminate; while WaitForSingleObject(FWorker.Handle, WaitHint-100) = WAIT_TIMEOUT do ReportStatus; FreeAndNil(FWorker); end; Stopped := True; end; { TMainWorkThread } constructor TMainWorkThread.Create; var FileName: String; begin inherited Create({CreateSuspended=}False); FileName := ExtractFilePath(ParamStr(0)) + '\WorkerLog.txt'; {$IFDEF UNICODE} FLog := TStreamWriter.Create(FileName, False, TEncoding.Unicode); {$ELSE} FLog := TFileStream.Create(FileName, fmCreate); {$ENDIF} end; destructor TMainWorkThread.Destroy; begin FLog.Free; inherited; end; procedure TMainWorkThread.Execute; var Text: string; begin inherited; while not Terminated do begin Inc(FRepetition); Text := Format('Logging repetition %d'#13#10, [FRepetition]); {$IFDEF UNICODE} FLog.Write(Text); {$ELSE} FLog.Write(Text[1], Length(Text)); {$ENDIF} Sleep(1000); end; end; end.
哔声将无法正常工作,看到这个职位 。
您的过程LG
是不健全的,如果日志文件不存在可能会失败。 服务用户也必须有权访问该文件。 在第一步中,您可以使用您的用户帐户运行服务进行测试。
删除下面的方法事件
procedure TAviaABSwedenAMailer.ServiceExecute(Sender: TService); begin while not Terminated do begin Beep; Sleep(500); LG('Amailer is running'); ServiceThread.ProcessRequests(False); end; end;