環境:Win2000虛擬機 + Delphi 7.0
一個很簡單的Service程式,只是將Service當前的各個步驟列印出log檔案而已,log能正常列印出來。
但是install后不能啟動。 請大家幫忙看看。代碼很簡單,解決后立即結貼, 在線等:
unit Main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
ExtCtrls, ActiveX;
type
TServiceThread = class(TThread)
protected
procedure Execute; override;
public
constructor Create;
destructor Destroy; override;
end;
TXBXService = class(TService)
procedure ServiceCreate(Sender: TObject);
procedure ServiceDestroy(Sender: TObject);
procedure ServiceExecute(Sender: TService);
procedure ServicePause(Sender: TService; var Paused: Boolean);
procedure ServiceShutdown(Sender: TService);
procedure ServiceStart(Sender: TService; var Started: Boolean);
procedure ServiceStop(Sender: TService; var Stopped: Boolean);
procedure ServiceContinue(Sender: TService; var Continued: Boolean);
procedure ServiceBeforeUninstall(Sender: TService);
procedure ServiceBeforeInstall(Sender: TService);
procedure ServiceAfterUninstall(Sender: TService);
procedure ServiceAfterInstall(Sender: TService);
private
{ Private declarations }
FServiceThread: TServiceThread;
public
function GetServiceController: TServiceController; override;
{ Public declarations }
end;
var
XBXService: TXBXService;
procedure WriteLog(const Txt: AnsiString);
implementation
{$R *.DFM}
procedure WriteLog(const Txt: AnsiString);
const
fff = 'C:\Server.log';
CNLF = #13#10;
var
Stream: TStream;
buf: array [0..50 * 1024] of AnsiChar;
DTStr: string;
begin
if not FileExists(fff) then
Stream := TFileStream.Create(fff, fmCreate)
else Stream := TFileStream.Create(fff, fmOpenReadWrite);
Stream.Position := Stream.Size;
try
DTStr := FormatDateTime('YYYY-MM-DD HH:NN:SS', Now()) + ' ====> ';
CopyMemory(@buf, PAnsiChar(DTStr), Length(DTStr));
Stream.WriteBuffer(buf, length(DTStr));
CopyMemory(@buf, PAnsiChar(Txt + CNLF), Length(Txt + CNLF));
Stream.WriteBuffer(buf, length(Txt + CNLF));
finally
Stream.Free;
end;
end;
procedure ServiceController(CtrlCode: DWord); stdcall;
begin
XBXService.Controller(CtrlCode);
end;
function TXBXService.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;
procedure TXBXService.ServiceCreate(Sender: TObject);
begin
WriteLog('=============================');
WriteLog('ServiceCreate(服務創建)');
end;
procedure TXBXService.ServiceDestroy(Sender: TObject);
begin
WriteLog('ServiceDestroy(服務關閉)');
WriteLog('=======================================');
if Assigned(FServiceThread) then
begin
FServiceThread.Terminate;
FServiceThread := nil;
end;
end;
procedure TXBXService.ServiceExecute(Sender: TService);
begin
WriteLog('ServiceExecute');
end;
procedure TXBXService.ServicePause(Sender: TService; var Paused: Boolean);
begin
WriteLog('ServicePause');
FServiceThread.Terminate;
FServiceThread.WaitFor;
FServiceThread := nil;
end;
procedure TXBXService.ServiceShutdown(Sender: TService);
begin
WriteLog('ServiceShutdown');
end;
procedure TXBXService.ServiceStart(Sender: TService; var Started: Boolean);
begin
CoInitialize(nil);
WriteLog('ServiceStart');
FServiceThread := TServiceThread.Create;
Started := True;
end;
procedure TXBXService.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
WriteLog('ServiceStop');
FServiceThread.Terminate;
FServiceThread.WaitFor;
FServiceThread := nil;
Stopped := True;
CounInitialize;
end;
procedure TXBXService.ServiceContinue(Sender: TService;
var Continued: Boolean);
begin
WriteLog('ServiceContinue');
end;
procedure TXBXService.ServiceBeforeUninstall(Sender: TService);
begin
WriteLog('ServiceBeforeUninstall');
end;
procedure TXBXService.ServiceBeforeInstall(Sender: TService);
begin
WriteLog('ServiceBeforeInstall');
end;
procedure TXBXService.ServiceAfterUninstall(Sender: TService);
begin
WriteLog('ServiceAfterUninstall');
end;
procedure TXBXService.ServiceAfterInstall(Sender: TService);
begin
WriteLog('ServiceAfterInstall');
end;
{ TServiceThread }
constructor TServiceThread.Create;
begin
inherited Create(False);
FreeOnTerminate := True;
WriteLog('Service Thread Opened.');
end;
destructor TServiceThread.Destroy;
begin
WriteLog('Service Thread Closed.');
inherited;
end;
procedure TServiceThread.Execute;
begin
while not Terminated do
begin
WriteLog(IntToStr(GetTickCount));
Sleep(2000);
end;
end;
end.
uj5u.com熱心網友回復:
請大家分析分析,log如下:install列印的log
2012-06-21 15:52:43 ====> =============================
2012-06-21 15:52:43 ====> ServiceCreate(服務創建)
2012-06-21 15:52:43 ====> ServiceBeforeInstall
2012-06-21 15:52:43 ====> ServiceAfterInstall
2012-06-21 15:52:44 ====> ServiceDestroy(服務關閉)
2012-06-21 15:52:44 ====> =======================================
啟動列印的log
2012-06-21 15:52:46 ====> =============================
2012-06-21 15:52:46 ====> ServiceCreate(服務創建)
2012-06-21 15:52:46 ====> ServiceStart
2012-06-21 15:52:46 ====> Service Thread Opened.
2012-06-21 15:52:46 ====> ServiceExecute
2012-06-21 15:52:46 ====> 18695642
2012-06-21 15:52:46 ====> ServiceDestroy(服務關閉)
2012-06-21 15:52:46 ====> =======================================
Uninstall列印的log
2012-06-21 15:52:51 ====> =============================
2012-06-21 15:52:51 ====> ServiceCreate(服務創建)
2012-06-21 15:52:51 ====> ServiceBeforeUninstall
2012-06-21 15:52:52 ====> ServiceAfterUninstall
2012-06-21 15:52:52 ====> ServiceDestroy(服務關閉)
2012-06-21 15:52:52 ====> =======================================
uj5u.com熱心網友回復:
一直沒用過 service ... 我用的 ServiceApplication ,你試試,我沒有出過你這樣的現象..uj5u.com熱心網友回復:
就是建的Service Applicationuj5u.com熱心網友回復:
我剛看了一下,我發現建立Service 和 Service Application模板沒有什么區別到底區別在哪里,我這里確實是建立的 Service Application.
uj5u.com熱心網友回復:
還沒解決,這帖子怎么結啊,想找個能給分的都找不到。uj5u.com熱心網友回復:
最近公司需要我用delphi寫一個服務,屬于現學現賣,遇到了和你一樣的問題,不如一起討論一下。首先,我在遇到這個問題后,查看了一下事件查看器,發現并不是install后不能啟動。點擊啟動后,事件查看器有三個內容,是同一時間的,如下:
ServiceTest 服務成功發送一個 開始 控制元件。
ServiceTest 服務處于 正在運行 狀態。
ServiceTest 服務處于 停止 狀態。
由這三個內容可以知道,并不是不能啟動,而是啟動后又停止了。
在你的代碼中
procedure TXBXService.ServiceExecute(Sender: TService);
begin
WriteLog('ServiceExecute');
end;
只執行了一句話,就結束了。
改成如下的代碼
procedure TXBXService.ServiceExecute(Sender: TService);
begin
WriteLog('ServiceExecute');
while not Terminated do begin
//執行的代碼
end;
end;
就OK了
uj5u.com熱心網友回復:
同意,Service的訊息回圈是要自己寫的
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/146314.html
標籤:網絡通信/分布式開發
上一篇:如何查找檔案?
下一篇:Delphi6生成的OCX控制元件在MyEclipse中呼叫無法使用Ctrl+C/V/X/Z/Y等快捷鍵和方向鍵
