服务启动问题(请僵哥解答,也欢迎其它高手)

lancechu 2009-03-15 09:19:44
为什么我写的服务开机时不随机启动呢,在服务控制器里启动时报1053错误,不解中。。。。。。
请高手指点

Run|Parameters 里设置'install'

===========================================
if ParamCount <> 0 then
begin
SvcMgr.Application.Initialize;
CCJHSer := TCCJHSer.CreateNew(SvcMgr.Application, 0);
SvcMgr.Application.CreateForm(TCCJHSer, CCJHSer);
SvcMgr.Application.Run;
end
else
begin
Forms.Application.ShowMainForm := False;
Forms.Application.Initialize;
Forms.Application.CreateForm(TFrm_Main, Frm_Main);
Forms.Application.Run;
end;

===============================================
procedure TFrm_Main.FormCreate(Sender: TObject);
var
MyIni: TIniFile;
FileName:string;
begin
Try
FileName := ExtractFilePath(paramstr(0))+'SetUp.ini';
MyIni := TIniFile.Create(filename);
edt_Part.Text:= MyIni.ReadString('Service','Part','6678');
lb_Address.Caption := LocalIP;
ShowBalloonTips(App_Caption,'服务器正在启动...');
FormStyle := fsStayOnTop; {窗口最前}
SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW); {不在任务栏显示}
FFrmClose := False;
AddIconToTray;
ShowBalloonTips(App_Caption,'正在检测信息...');
Action_CheckDogExecute(Sender);
if (DogInfo.FIsRigth) or (DogDetailInfo.FIsProrata = 2) then
begin
SS.Port := StrToInt(edt_Part.Text);
SS.Active := True;
ShowBalloonTips(App_Caption,'初始化成功,其它客户端可以正常使用!');
end
else
begin
ShowBalloonTips(App_Caption,'初始化失败!');
end;
ConCount := 0;
finally
FreeAndNil(MyIni);
end;
end;
...全文
171 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
lancechu 2009-03-27
  • 打赏
  • 举报
回复
最终还是没有解决问题,被逼无奈只好改成EXE

不过还是谢谢大家地关注,结贴了!
nbzip 2009-03-19
  • 打赏
  • 举报
回复
-- Forms.Application.ShowMainForm := False;
| Forms.Application.Initialize;
| Forms.Application.CreateForm(TFrm_Main, Frm_Main);
-> Forms.Application.ShowMainForm := False; //这句移到此处.
Forms.Application.Run;
==============================================================================
从你的上面这此话看,好像 :procedure TFrm_Main.FormCreate(Sender: TObject);
你是用DELPHI建立一个服务项目吗?,还是你做了一个项目,后面想加入你的程序到服务中去.

====================================================下面这段是注册服务,打开和关闭.
int __fastcall TPDService::Server_Action(int izt)
{
SC_HANDLE hService,hSCManager; //SC_HANDLE hscmanager,hService;
hService=NULL;
try{
if(izt==0) //注册
{
AnsiString fdir;
fdir=GetCurrentDir()+"\\PSERVER.exe";
if((hSCManager=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS))==NULL) return 0;
hService=CreateService( hSCManager, //句柄
"PDService", //服务开始名
"PDService",//显示服务名
SERVICE_ALL_ACCESS,//服务访问类型
SERVICE_WIN32_OWN_PROCESS,//服务类型
SERVICE_AUTO_START,//自动启动服务
SERVICE_ERROR_IGNORE,//忽略错误
fdir.c_str(), //启动的文件名
NULL,//name of load ordering group (载入组名)
NULL,//标签标识符
NULL,//相关性数组名
NULL,//帐户(当前)
NULL);//密码(当前)
if(hService==NULL) return -1;
if(StartService(hService,0,NULL)==0) return -2;
}
if(izt==1) //打开
{
if((hSCManager=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS))==NULL) return 0;
if((hService=OpenService(hSCManager,"PDService",SERVICE_START))==NULL) return -1;
if(StartService(hService,0,NULL)==0) return -2;
}
if(izt==2) //结束
{
if ((hSCManager=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS))==NULL) return 0;
if((hService=OpenService(hSCManager,"PDService",SERVICE_STOP))==NULL) return -1;
SERVICE_STATUS ServiceStatus;
if(ControlService(hService,SERVICE_CONTROL_STOP,&ServiceStatus)==NULL) return -2;
}
return 1;
}__finally{
CloseServiceHandle(hService);
CloseServiceHandle(hSCManager);
}
}
lancechu 2009-03-19
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 nbzip 的回复:]
-- Forms.Application.ShowMainForm := False;
| Forms.Application.Initialize;
| Forms.Application.CreateForm(TFrm_Main, Frm_Main);
-> Forms.Application.ShowMainForm := False; //这句移到此处.
Forms.Application.Run;
==============================================================================
从你的上面这此话看,好像 :procedure TFrm_Main.FormCreate(Sen…
[/Quote]

我是先建立的一个服务项目,因为这个服务里需要有界面显示,所以才加了一个窗体
procedure TFrm_Main.FormCreate(Sender: TObject);
在那个窗体的创建过程里写了其它的过程
lancechu 2009-03-19
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 unsigned 的回复:]
CCJHSer := TCCJHSer.CreateNew(SvcMgr.Application, 0);
SvcMgr.Application.CreateForm(TCCJHSer, CCJHSer);

这个CCJHSer 为什么会被两次初始化?
[/Quote]

if ParamCount <> 0 then
begin
SvcMgr.Application.Initialize;
CCJHSer := TCCJHSer.CreateNew(SvcMgr.Application, 0);
SvcMgr.Application.CreateForm(TFrm_Main, Frm_Main); //这个地方是写错了,不过修改过来后还是有问题,主要问题不在这
SvcMgr.Application.Run;
end
else
begin
Forms.Application.ShowMainForm := False;
Forms.Application.Initialize;
Forms.Application.CreateForm(TFrm_Main, Frm_Main);
Forms.Application.Run;
end;
nbzip 2009-03-18
  • 打赏
  • 举报
回复
程序名 /INSTALL /UNINSTALL 只是注册和反注册. 并不包括打开该服务功能.

在程序内就是一个TSERVER的事件中,好像有INSTALL之后,和UNINSTALL之前的事件.
在INSTALL之后,就是打开该服务.
在UNINSTALL之前,就是关闭该服务.

要随机打开....!
只要改变该服务的状态,让其自动打开状态.

=====================
打开该服务,用API startserver,
关闭该服务, ControlService





僵哥 2009-03-18
  • 打赏
  • 举报
回复
CCJHSer := TCCJHSer.CreateNew(SvcMgr.Application, 0);
SvcMgr.Application.CreateForm(TCCJHSer, CCJHSer);

这个CCJHSer 为什么会被两次初始化?
lancechu 2009-03-18
  • 打赏
  • 举报
回复
谁帮我解决了,我送200分给他
lancechu 2009-03-18
  • 打赏
  • 举报
回复
继续征集答案......
lancechu 2009-03-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 unsigned 的回复:]
另外,楼主的服务程序在服务管理器当中是否有设置参数?如果没有,也会失败。
默认情况下通过/Install安装的服务并不能自己写入相应的参数,而楼主的服务却需要参数才能够进行服务初始化。暂时可以试着到服务管理器当中为服务添加启动参数。
[/Quote]

服务管理器中也设置了参数 install,但是还是启动不起来
请问僵哥我应该如何去修改代码呢?
僵哥 2009-03-16
  • 打赏
  • 举报
回复
另外,楼主的服务程序在服务管理器当中是否有设置参数?如果没有,也会失败。
默认情况下通过/Install安装的服务并不能自己写入相应的参数,而楼主的服务却需要参数才能够进行服务初始化。暂时可以试着到服务管理器当中为服务添加启动参数。
僵哥 2009-03-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 mwy654321 的回复:]
不需要写任何代码,只要设置好服务的自启动类型,开机就可以启动了。

注意不要USES这个Forms单元。
[/Quote]
1. 这里必须Uses这个Forms单元,楼主期望是一个服务和普通应用程序“两栖”的应用程序(根据是否有参数区分)
2. 手动启动服务提示失败,设置为自启动也无法启动服务。
无条件为你 2009-03-16
  • 打赏
  • 举报
回复
不需要写任何代码,只要设置好服务的自启动类型,开机就可以启动了。

注意不要USES这个Forms单元。
僵哥 2009-03-16
  • 打赏
  • 举报
回复
服务没写好。
lancechu 2009-03-15
  • 打赏
  • 举报
回复
是什么原因呢?
僵哥 2009-03-15
  • 打赏
  • 举报
回复
启动失败。

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧