今日小弟写了一个服务程序,在服务程序中启动另一个程序,但是没有成功。具体代码如下:
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程序可以双击执行无误。
小弟百思不得其解,望高手不吝赐教,指出代码中的不到之处,谢谢!

解决方案 »

  1.   

    PChar(WinDir+'\remote.exe'), 这个路径有没有空格呢?
    你用桌面程序的方式能否启动呢?
      

  2.   

    在服务里,文件路径,不知道怎么搞。
    你把程序放在 system32里面应该可以执行,
    找不到路径,迷茫中
      

  3.   

    使用CreateProcess试试,ShellExecute是外壳程序接口,你的服务进程应该是要获得桌面用户权限才能正常调用,服务是system用户的话大概会有问题吧。
      

  4.   

    用CreateProcessAsUser 去启动
    很简单的。 
      

  5.   

    服务程序从网络上下载的remote.exe其实是用来注销系统的,所以,服务程序启动remote.exe后应该是会注销系统的,可是没有什么反应。
    谢谢大家的意见,我试一下CreateProcessAsUser再说吧。