Форум: "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.042 c