网上搜了半天没有正确答案,
在不就是不了了之
简单点说下吧。TService1.ServiceExecute(Sender: TService);
begin
end中执行调用外部的一个窗口程序。用
ShellExecute(0,nil,'E:\demoExe.exe', nil,nil,SW_SHOW);
现象是能调用起来,但是不显示窗口,任务管理器中可以看到。
在网上查了查,
这个方法好像是肯定不行了,貌似是因为在winService中没有desktop,
需要使用windows的其他账户重新创建一个进程。然后我就调用了这个函数 RunAsUser('ADOMAIN', 'administrator', '123', 'e:\demoExe.exe');具体代码-----------------------------------------
procedure   RunAsUser(const   Domain,   Username,   Password,   Command:   string);
  var
      StartupInfo:   TStartupInfo;
      ProcessInfo:   TProcessInformation;
      wDomain,   wUsername,   wPassword,   wCommand:   PWideChar;
  begin
      FillChar(StartupInfo,   SizeOf(StartupInfo),   #0);
      StartupInfo.cb   :=   SizeOf(StartupInfo);   
      StartupInfo.dwFlags   :=   STARTF_USESHOWWINDOW;
      StartupInfo.wShowWindow   :=   SW_SHOWNORMAL;
    
      GetMem(   
          wDomain,   
          Length(Domain)   *   SizeOf(WideChar)   +   SizeOf(WideChar));   
      GetMem(   
          wUsername,
          Length(Username)   *   SizeOf(WideChar)   +   SizeOf(WideChar));   
      GetMem(   
          wPassword,   
          Length(Password)   *   SizeOf(WideChar)   +   SizeOf(WideChar));   
      GetMem(   
          wCommand,
          Length(Command)   *   SizeOf(WideChar)   +   SizeOf(WideChar));   
    
      StringToWideChar(   
          Domain,   
          wDomain,   
          Length(Domain)   *   SizeOf(WideChar)   +   SizeOf(WideChar));
      StringToWideChar(   
          Username,   
          wUsername,   
          Length(Username)   *   SizeOf(WideChar)   +   SizeOf(WideChar));   
      StringToWideChar(   
          Password,
          wPassword,   
          Length(Password)   *   SizeOf(WideChar)   +   SizeOf(WideChar));   
      StringToWideChar(   
          Command,   
          wCommand,   
          Length(Command)   *   SizeOf(WideChar)   +   SizeOf(WideChar));
    
      if   not   CreateProcessWithLogonW(   
          wUsername,   
          wDomain,   
          wPassword,   
          0,
          nil,   
          wCommand,   
          0,   
          nil,   
          nil,
          StartupInfo,
          ProcessInfo)   then   RaiseLastOSError;      FreeMem(wDomain);
      FreeMem(wUsername);   
      FreeMem(wPassword);   
      FreeMem(wCommand);
  end;   -------------------------------------------------但是结果是
窗口依旧没有显示出来,在任务管理器中能看到。
不知道谁成功的做过从windows service中调用外部的窗口程序。
求教各位大大了~~~谢谢~~~~