Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.12.05;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.12.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.05 c
4-1098694249
Wolffgang
2004-10-25 12:50
2004.12.05
Серийник винта.


4-1098088573
DelphiLexx
2004-10-18 12:36
2004.12.05
RegisterServiceProcess


3-1099568858
av_mark
2004-11-04 14:47
2004.12.05
Отрисовка DBGrid


1-1100341699
dimaxx
2004-11-13 13:28
2004.12.05
Парсер путей файлов


1-1100682349
Игоръ
2004-11-17 12:05
2004.12.05
Сохранение картинки в файл





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский