在下作了一个service application,有操作界面的,主要是参考delphi的scktsrvr,现在有一些问题请教大家:
1、调试service有什么方便的方法?
2、如何通过控制界面控制启动、停止service,就象apache 和sqlserver manager那样。
3、现在我把程序作为service运行时从控制界面关闭时无响应,当普通应用程序运行时可以正常关闭,不知问题在那里。
手头没有资料,各位多多帮忙,300分决不食言!
1、调试service有什么方便的方法?
2、如何通过控制界面控制启动、停止service,就象apache 和sqlserver manager那样。
3、现在我把程序作为service运行时从控制界面关闭时无响应,当普通应用程序运行时可以正常关闭,不知问题在那里。
手头没有资料,各位多多帮忙,300分决不食言!
解决方案 »
- 如何获得外部程序SYSLISTVIEW32某行某列的图像索引?
- 列表数据导入零时数据库问题
- 请问有没有中文版的Delhi
- 关于U盘的一些问题?高手进来!
- 100分求办公自动化管理系统,c/s结构。
- 关于Appbar的问题
- idsmtp邮件群发的问题?如何进行需认证服务器设置!
- -==== 今天要注册一个域名,大家来帮忙取个域名! 在线等====-
- sql update的用法?
- delphi mscomm控件使用
- 我使用 odbc 连接 vfp 数据库,却不能向 vfp 中那样使用 "select * into dbf tbname from tbname" 来生成dbf 文件
- 请各位大师指点:网络上两个数据库数据传送问题(在线等待)
{$IFDEF DEBUG}
procedure CreateLog(LogStr:String);
var
FileName:String;
LogFile:TextFile;
begin
FileName:=ChangeFileExt(ParamStr(0),'.log');
AssignFile(LogFile,FileName);
if FileExists(FileName) then
Append(LogFile)
else
Rewrite(LogFile);
WriteLn(LogFile,DateTimeToStr(Now)+':'+#9+LogStr);
CloseFile(LogFile);
end;
{$ENDIF}
在程序中用:
{$IFDEF DEBUG}CreateLog('TMsgAgentThread.SetMailSendedFlag');{$ENDIF}
来输出。2。下面这段函数示范了停止并反安装一个service程序,启动的和停止的差不多,自己翻msdn:
function CanCreateService():Boolean;
var
SvcMgr:DWORD;
ServiceHandle:DWORD;
ServiceStatus:_SERVICE_STATUS;
begin
Result:=false;
SvcMgr:=0;
ServiceHandle:=0;
try
SvcMgr:=OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
if SvcMgr=0 then begin
{$IFDEF DEBUG}CreateLog('Error when open service manager');{$ENDIF}
exit;
end;
ServiceHandle:=OpenService(SvcMgr,PChar(ServiceName),SERVICE_ALL_ACCESS);
if ServiceHandle=0 then begin
{$IFDEF DEBUG}CreateLog('Service havn''t been installed');{$ENDIF}
Result:=true;
exit;
end;
if not QueryServiceStatus(ServiceHandle,ServiceStatus) then begin
{$IFDEF DEBUG}CreateLog('Error when query service status');{$ENDIF}
exit;
end;
if ServiceStatus.dwCurrentState=SERVICE_RUNNING then begin
{$IFDEF DEBUG}CreateLog('Service is running');{$ENDIF}
if not ControlService(ServiceHandle,SERVICE_CONTROL_STOP,ServiceStatus) then begin
{$IFDEF DEBUG}CreateLog('Error when stop service');{$ENDIF}
exit;
end;
end;
if not DeleteService(ServiceHandle) then begin
{$IFDEF DEBUG}CreateLog('Error when delete service');{$ENDIF}
exit;
end;
Result:=true;
finally
if SvcMgr<>0 then begin
CloseServiceHandle(SvcMgr);
end;
if ServiceHandle<>0 then begin
CloseServiceHandle(ServiceHandle);
end;
end;
end;3。service程序中都必须使用thread来做真正的处理工作,不然你的程序就会无法响应消息。procedure ServiceController(CtrlCode: DWord); stdcall;
begin
MsgService.Controller(CtrlCode);
end;function TMsgService.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;procedure TMsgService.ServiceStart(Sender: TService; var Started: Boolean);
begin
if not Assigned(FMsgAgentThread) then begin
FMsgAgentThread:=TMsgAgentThread.Create(false);
Started:=true;
end
else begin
Started:=false;
end;
end;procedure TMsgService.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
if Assigned(FMsgAgentThread) then begin
FMsgAgentThread.Terminate;
FMsgAgentThread.WaitFor;
FreeAndNil(FMsgAgentThread);
Stopped:=true;
end
else begin
Stopped:=false;
end;
end;procedure TMsgService.ServicePause(Sender: TService; var Paused: Boolean);
begin
if Assigned(FMsgAgentThread) then begin
FMsgAgentThread.Suspend;
Paused:=true;
end
else begin
Paused:=false;
end;
end;procedure TMsgService.ServiceContinue(Sender: TService;
var Continued: Boolean);
begin
if Assigned(FMsgAgentThread) then begin
FMsgAgentThread.Resume;
Continued:=true;
end
else begin
Continued:=false;
end;
end;差不多把我做的程序全贴给你了,再不会作的话我就胸闷了。。