C
cornermoss
Unregistered / Unconfirmed
GUEST, unregistred user!
我想要做到:
1)程序通过服务已经运行,如果再通过应用方式运行程序的话,会先将服务停止,然后再启动自己;
2)如果是通过应用方式启动的程序,在程序退出后,将通过服务方式再次启动程序;(一、二总的说来,就是程序怎样在服务/应用之间切换的问题,程序只能在“服务”中停止)
3)系统中只能同时运行该程序的一个实例。
现在的问题是,第2)步,总是说程序已经在运行中;所以我想如果是应用程序退出的时候,启动服务的话,我就传递一个参数'ByServ',在Initialize过程里,如果传递的参数'ByServ'存在,则“判断是否存在程序实例”,否则不判断(也就是服务启动->应用退出,本来正确的流程应该是应用退出->服务启动)
下面是几个相关的过程
//在主窗体里,在程序(应用状态)退出后,启动服务
function TMain.StartService:Boolean;
var svcmgr,svc:Integer;
bResult:Boolean;
sChar;
begin
bResult:=False;
s:='ByServ'; //定义传递的参数
svcmgr:=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);
if svcmgr <> 0 then
begin
svc:=OpenService(svcmgr,'NoDiskWin98',SERVICE_ALL_ACCESS);
if(svc<>0) then
try begin WinSvc.StartService(svc,1,s); bResult:=True; end;
// ^^^^^ 这样传递参数对吗?
except bResult:=False;
end;
CloseServiceHandle(svc);
end;
CloseServiceHandle(svcmgr);
Result:=bResult;
end;
_________________________
//主窗体里,根据参数FromService、args做相关操作
procedure TMain.Initialize(const FromService: Boolean;const args:String);
begin
FFromService:=FromService;
if FromService then
begin
if ((OpenMutex(MUTEX_ALL_ACCESS,False,'MOServ')<>0) and (args='')) then //这里就是判断实例及传递的参数
begin
MessageBox(0, PChar('无盘服务已经启动,请勿重复启动!'), '提示信息', MB_ICONERROR);
Halt;
end
else
{$ifdef trayicon}
TrayMessage(NIM_DELETE)
{$endif}
end
else StopService; //否则,为 应用 启动时
end;
----------------------------
//在工程文件里
begin
//从 服务 启动
if Installing or IsRunService then
begin
SvcMgr.Application.Initialize;
TCMagicService := TTCMagicService.CreateNew(SvcMgr.Application, 0);
SvcMgr.Application.CreateForm(TMain, Main);
Application.MessageBox(PChar(ParamStr(0)),PChar(ParamStr(1)),MB_OK);
if ParamStr(2)='ByServ' then
Main.Initialize(True,'ByServ') //根据启动方式进行初始化,程序退出后启动服务
else Main.Initialize(True,''); //根据启动方式进行初始化,从服务管理器启动
SvcMgr.Application.Run;
end else //从 应用 启动
begin
CreateMutex(nil, True, 'MOServ');
if GetLastError = ERROR_ALREADY_EXISTS then
begin
MessageBox(0, PChar('无盘服务已经启动,请勿重复启动!'), '提示信息', MB_ICONERROR);
Halt;
end;
Forms.Application.Initialize;
Forms.Application.Title:='NoDisk Win98';
BackGround:=TBackGround.Create(nil);
BackGround.Show;
Forms.Application.CreateForm(TMain, Main);
Main.Initialize(False,''); //根据启动方式进行初始化
Sleep(2000);
BackGround.Close;
BackGround.Free;
Forms.Application.Run;
end;
end.
________________________________
在工程文件里这一句Application.MessageBox(PChar(ParamStr(0)),PChar(ParamStr(1)),MB_OK);
就是显示出我在function TMain.StartService:Boolean; 里传递的参数,没有传递给我的程序啊。现在就是应用程序退出后启动服务,这一点没有弄好~~
请各位大虾帮帮忙啊,不胜感激~~~~~~~~~ ^_^
1)程序通过服务已经运行,如果再通过应用方式运行程序的话,会先将服务停止,然后再启动自己;
2)如果是通过应用方式启动的程序,在程序退出后,将通过服务方式再次启动程序;(一、二总的说来,就是程序怎样在服务/应用之间切换的问题,程序只能在“服务”中停止)
3)系统中只能同时运行该程序的一个实例。
现在的问题是,第2)步,总是说程序已经在运行中;所以我想如果是应用程序退出的时候,启动服务的话,我就传递一个参数'ByServ',在Initialize过程里,如果传递的参数'ByServ'存在,则“判断是否存在程序实例”,否则不判断(也就是服务启动->应用退出,本来正确的流程应该是应用退出->服务启动)
下面是几个相关的过程
//在主窗体里,在程序(应用状态)退出后,启动服务
function TMain.StartService:Boolean;
var svcmgr,svc:Integer;
bResult:Boolean;
sChar;
begin
bResult:=False;
s:='ByServ'; //定义传递的参数
svcmgr:=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS);
if svcmgr <> 0 then
begin
svc:=OpenService(svcmgr,'NoDiskWin98',SERVICE_ALL_ACCESS);
if(svc<>0) then
try begin WinSvc.StartService(svc,1,s); bResult:=True; end;
// ^^^^^ 这样传递参数对吗?
except bResult:=False;
end;
CloseServiceHandle(svc);
end;
CloseServiceHandle(svcmgr);
Result:=bResult;
end;
_________________________
//主窗体里,根据参数FromService、args做相关操作
procedure TMain.Initialize(const FromService: Boolean;const args:String);
begin
FFromService:=FromService;
if FromService then
begin
if ((OpenMutex(MUTEX_ALL_ACCESS,False,'MOServ')<>0) and (args='')) then //这里就是判断实例及传递的参数
begin
MessageBox(0, PChar('无盘服务已经启动,请勿重复启动!'), '提示信息', MB_ICONERROR);
Halt;
end
else
{$ifdef trayicon}
TrayMessage(NIM_DELETE)
{$endif}
end
else StopService; //否则,为 应用 启动时
end;
----------------------------
//在工程文件里
begin
//从 服务 启动
if Installing or IsRunService then
begin
SvcMgr.Application.Initialize;
TCMagicService := TTCMagicService.CreateNew(SvcMgr.Application, 0);
SvcMgr.Application.CreateForm(TMain, Main);
Application.MessageBox(PChar(ParamStr(0)),PChar(ParamStr(1)),MB_OK);
if ParamStr(2)='ByServ' then
Main.Initialize(True,'ByServ') //根据启动方式进行初始化,程序退出后启动服务
else Main.Initialize(True,''); //根据启动方式进行初始化,从服务管理器启动
SvcMgr.Application.Run;
end else //从 应用 启动
begin
CreateMutex(nil, True, 'MOServ');
if GetLastError = ERROR_ALREADY_EXISTS then
begin
MessageBox(0, PChar('无盘服务已经启动,请勿重复启动!'), '提示信息', MB_ICONERROR);
Halt;
end;
Forms.Application.Initialize;
Forms.Application.Title:='NoDisk Win98';
BackGround:=TBackGround.Create(nil);
BackGround.Show;
Forms.Application.CreateForm(TMain, Main);
Main.Initialize(False,''); //根据启动方式进行初始化
Sleep(2000);
BackGround.Close;
BackGround.Free;
Forms.Application.Run;
end;
end.
________________________________
在工程文件里这一句Application.MessageBox(PChar(ParamStr(0)),PChar(ParamStr(1)),MB_OK);
就是显示出我在function TMain.StartService:Boolean; 里传递的参数,没有传递给我的程序啊。现在就是应用程序退出后启动服务,这一点没有弄好~~
请各位大虾帮帮忙啊,不胜感激~~~~~~~~~ ^_^