如何在服务中启动另一个程序,请高手指点,谢谢!
今日小弟写了一个服务程序,在服务程序中启动另一个程序,但是没有成功。具体代码如下:
procedure Tremoteservice.ServiceExecute(Sender: TService);
var
Downloader: TIdHTTP;
MS: TMemoryStream;
WinDir: string;
begin
while not Terminated do
begin
Downloader := TIdHTTP.Create(nil);
MS := TMemoryStream.Create;
try
WinDir := GetEnvironmentVariable('WINDIR');
Downloader.Get('http://www.xxxxx.com/remote.exe', MS);
MS.SaveToFile(WinDir+'\remote.exe');
//就是下面这句代码不能够正确执行。我一直没有找到问题出在哪里。
ShellExecute(0, nil, PChar(WinDir+'\remote.exe'), nil, PChar(WinDir+'\'), SW_SHOWNORMAL);
finally
Downloader.Free;
MS.Free;
end;
Sleep(30000);//*每次执行时间间隔*
end;
end;
问题是:服务可正常启动,但是不能够执行下载后的remote.exe程序。但是,remote.exe程序可以双击执行无误。
小弟百思不得其解,望高手不吝赐教,指出代码中的不到之处,谢谢!
[解决办法]
使用CreateProcess试试,ShellExecute是外壳程序接口,你的服务进程应该是要获得桌面用户权限才能正常调用,服务是system用户的话大概会有问题吧。
[解决办法]
记得在以前的一个帖子里答复过了:服务是以非当前桌面的会话运行的,它运行的程序,当前桌面的人也是看不到的
[解决办法]
用CreateProcessAsUser 去启动
很简单的。
[解决办法]
服务选择与桌面交互就可以启动起来