Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.05;
Скачать: CL | DM;

Вниз

Запуск программ сервисом   Найти похожие ветки 

 
Jetus ©   (2004-10-24 11:56) [0]

Уважаемые мастера! У меня есть сервис под 2000/ХР, который должен в определённое время запускать другую программу. Но тут появилась проблема: сервис запускается вместе в Windows и в списке процессов стоит как "системный", и когда он запускает другую программу, то она тоже становится "системной" и визуально не отображается, хотя я и запускаю ее так:
WinExec(PChar(SomeProgramPath), SW_SHOW);
А мне надо, чтобы она отображалась визуально. В чем беда и как с ней бороться?


 
Anatoly Podgoretsky ©   (2004-10-24 12:54) [1]

А куда ее делать визуальной то, ведь рабочего стола то нет


 
Пётр Семёнович   (2004-10-24 16:41) [2]

Jetus ©
есть как минимум 3 способа запустить "нормально", тока все они - "изврат" ...


 
Alekc   (2004-10-24 20:01) [3]


> А мне надо, чтобы она отображалась визуально. В чем беда
> и как с ней бороться?

Попробуй сервису сделать WIN32_INTERACTIVE_ что-то там. Короче, чтобы процесс был интерактивным :)


 
DeadMeat ©   (2004-10-25 01:22) [4]

И запускай от имени другого пользователя...

---
...Death Is Only The Begining...


 
kaZaNoVa ©   (2004-10-25 01:44) [5]

DeadMeat ©   (25.10.04 1:22) [4]
ага, если пароль известен :)))))


 
Warlock ©   (2004-10-25 07:04) [6]

даже в родном виндовском Task Sheduler-е нужно указывать имя пользователя, от чьего имени будет запускаться программа, и его пароль..
Я в свое время тоже пытался сделать такой сервис, не очень удачно. Вот можете полюбоваться:

type
 TMyRunnerService = class(TService)
   procedure ServiceExecute(Sender: TService);
   procedure ServiceStart(Sender: TService; var Started: Boolean);
   procedure ServiceStop(Sender: TService; var Stopped: Boolean);
 private
   PI: PROCESS_INFORMATION;
//    Stream: TMemoryStream; // Add this line here
   { Private declarations }
   ProgramPath: String;
   function RunProgram: Boolean;
 public
   function GetServiceController: TServiceController; override;
   { Public declarations }
 end;

var
 MyRunnerService: TMyRunnerService;

implementation

{$R *.DFM}

uses shellapi;

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
 MyRunnerService.Controller(CtrlCode);
end;

function TMyRunnerService.GetServiceController: TServiceController;
begin
 Result := ServiceController;
end;

function TMyRunnerService.RunProgram: Boolean;
var SI: STARTUPINFO;
begin
// Stream.Write("Try start program"#13,18);
Result:=True;
ZeroMemory(@SI,SizeOf(SI));
SI.cb:=SizeOf(SI);
// SI.dwFlags:=STARTF_USESHOWWINDOW;
// SI.wShowWindow:=SW_SHOWMINNOACTIVE;
if not CreateProcess(nil,PChar(ProgramPath),nil,nil,False,0,nil,nil,SI,PI) then
 Result:=False;
// Stream.Write("End start program"#13,18);
end;

procedure TMyRunnerService.ServiceExecute(Sender: TService);
var ExCode: Cardinal;
//    Hnd: THandle;
begin
// if not RunProgram then
//  ServiceThread.Terminate;
// Stream.Write("Begin execute"#13,14);
RunProgram;
while not Terminated do
 begin
//   Stream.Write("One"#13,4);
//   Hnd:=OpenProcess(PROCESS_QUERY_INFORMATION,False,pi.dwProcessId);
//   Stream.Write("Two"#13,4);
//   if Hnd=0 then
//    begin
//     Stream.Write("Run repeat"#13,11);
//     RunProgram;
//    end;
//   Stream.Write("Three"#13,6);
  ServiceThread.ProcessRequests(True);
//    if not RunProgram then
//     ServiceThread.Terminate;
 end;
// Stream.Write("Start end"#13,10);
if pi.hProcess<>0 then
 if GetExitCodeProcess(pi.hProcess,ExCode) then
   if TerminateProcess(pi.hProcess,ExCode) then
    begin
//      Stream.Write("Complite"#13,9);
     CloseHandle(pi.hThread);
     CloseHandle(pi.hProcess);
    end;
end;

procedure TMyRunnerService.ServiceStart(Sender: TService;
 var Started: Boolean);
var    Res: HKEY;
      Err: Integer;
      ValType,PathSz: DWord;
begin
// Stream := TMemoryStream.Create;
// Stream.Write("On Start"#13,9);
Err:=RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Software\MyService",0,KEY_QUERY_VALUE,Res);
if Err<>ERROR_SUCCESS then
 begin
  Started:=False;
  Exit;
 end;
ValType:=REG_SZ;
Err:=RegQueryValueEx(Res,"PrgPath",nil,@ValType,nil,@PathSz);
if Err<>ERROR_SUCCESS then
 begin
  Started:=False;
  RegCloseKey(Res);
  Exit;
 end;
SetLength(ProgramPath,PathSz);
Err:=RegQueryValueEx(Res,"PrgPath",nil,@ValType,PByte(PChar(ProgramPath)),@PathSz);
if Err<>ERROR_SUCCESS then
 begin
  Started:=False;
  RegCloseKey(Res);
  Exit;
 end;
RegCloseKey(Res);
// Stream.Write("On Start Complite"#13,18);
end;

procedure TMyRunnerService.ServiceStop(Sender: TService;
 var Stopped: Boolean);
begin
//  Stream.Write("On Stop"#13,8);
 Stopped:=True;
//  Stream.Write("On Stop Complite"#13,17);
//  Stream.SaveToFile("D:\Temp\DerLog.log");
//  Stream.Free;
end;

end.


 
Jetus ©   (2004-10-25 08:15) [7]

Было бы неплохо сделать его интерактивным. Я регистрирую сервис так:

function CreateNTService(ExecutablePath, ServiceName, DisplayingName: String): Boolean;
var
 hNewService, hSCMgr: SC_HANDLE;
 FuncRetVal: Boolean;
begin
 FuncRetVal := False;
 hSCMgr := OpenSCManager(nil, nil, SC_MANAGER_CREATE_SERVICE);
 if (hSCMgr <> 0 ) then
   begin
     hNewService := CreateService(hSCMgr, PChar(ServiceName), PChar(DisplayingName),
                      STANDARD_RIGHTS_REQUIRED, SERVICE_INTERACTIVE_PROCESS,
                      SERVICE_AUTO_START, SERVICE_ERROR_IGNORE,
                      PChar(ExecutablePath), nil, nil, nil, nil, nil);
     CloseServiceHandle(hSCMgr);
     if (hNewService <> 0) then FuncRetVal := true else FuncRetVal := false;
   end;
 CreateNTService := FuncRetVal;
end;

Как видно, я пытаюсь сделать его интерактивным выставляя SERVICE_INTERACTIVE_PROCESS как параметр.
Но в этом случае сервис почему-то не регистрируется, как в случае если поставить SERVICE_WIN32_OWN_PROCESS.
Как бороться с этой несправедливостью?


 
Warlock ©   (2004-10-25 08:26) [8]

а так:

..,SERVICE_WIN32_OWN_PROCESS or SERVICE_INTERACTIVE_PROCESS,..



Страницы: 1 вся ветка

Текущий архив: 2004.12.05;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.032 c
3-1099645317
Pavor
2004-11-05 12:01
2004.12.05
Как побороть "Directory is controlled by other .NET file"?


8-1094305884
CyBeRBuGziLLa
2004-09-04 17:51
2004.12.05
ДАЙТЕ ПРОЦЕДУРУ СГЛАЖИВАНИЯ, ПЛИЗ


10-1069399394
Юрий
2003-11-21 10:23
2004.12.05
TCorbaConnection возвращает BAD_OPERATION


14-1100472710
Поручик
2004-11-15 01:51
2004.12.05
Для тех, кому слово X-COM о чем-то говорит.


3-1099501529
Vova
2004-11-03 20:05
2004.12.05
Добавление записей в таблицу с несколькими одинаково заполнеными