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

Вниз

объединение приложения и сервиса   Найти похожие ветки 

 
defen ©   (2010-07-11 05:01) [0]

Доброго времени суток. Подскажите пожалуйста если можно объединить сервис и приложение, которое он запускает в один ехе файл? Если можно, то как?


 
sniknik ©   (2010-07-11 15:36) [1]

в поставке дельфи есть пример - приложение scktsrvr с исходниками.

а вопрос это вовсе не WinAPI, понимаю, все непонятное кажется сложным и одинаковым, а что может быть сложнее WinAPI... но тем не менее это не одно и тоже.


 
Leonid Troyanovsky ©   (2010-07-12 08:04) [2]


> defen ©   (11.07.10 05:01)  

> объединить сервис и приложение, которое он запускает в один
> ехе файл?

uses.

--
Regards, LVT.


 
defen ©   (2010-07-12 14:52) [3]

уважаемые, это ветка "для начинающих" будте добры давать более развернутые ответы. не надо умничать!


 
Anatoly Podgoretsky ©   (2010-07-12 15:29) [4]

> defen  (12.07.2010 14:52:03)  [3]

Наконец то - Ты не умничай, ты код давай.


 
Leonid Troyanovsky ©   (2010-07-12 16:02) [5]


> defen ©   (12.07.10 14:52) [3]

> уважаемые, это ветка "для начинающих"

Ну, начиналась-то она как WinAPI.
И, видимо, для усвоения сложного задор тогда был.

> будте добры давать более развернутые ответы

А что непонятно?

--
Regards, LVT.


 
defen ©   (2010-07-13 01:31) [6]

про поставку говорили что-то...


 
Германн ©   (2010-07-13 02:37) [7]


> defen ©   (13.07.10 01:31) [6]
>
> про поставку говорили что-то...
>

Ну говорили. Искал?
Или "не умничай, код давай"?


 
defen ©   (2010-07-13 15:35) [8]

Какой код вам нужен? приложения или сервиса?


 
defen ©   (2010-07-13 15:40) [9]

От код сервиса, запускающего мою прогу... Надо, чтобы сервис перезапускал приложение при его несанкционированном закрытии...
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,Registry,
 WinSvc;

type
 TService1 = class(TService)
   procedure ServiceStart(Sender: TService; var Started: Boolean);
   procedure ServiceStop(Sender: TService; var Stopped: Boolean);
   procedure ServicePause(Sender: TService; var Paused: Boolean);
   procedure ServiceContinue(Sender: TService; var Continued: Boolean);
   procedure ServiceAfterInstall(Sender: TService);

 
 private
 
   { Private declarations }
 public
   function GetServiceController: TServiceController; override;
   { Public declarations }
 end;

var
 Service1: TService1;
  pi:PROCESS_INFORMATION;
 si:STARTUPINFO;

implementation

{$R *.DFM}

const
 SERVICE_CONFIG_FAILURE_ACTIONS = 2;

 SC_ACTION_NONE = 0;
 SC_ACTION_RESTART = 1;
 SC_ACTION_REBOOT = 2;
 SC_ACTION_RUN_COMMAND = 3;

 SE_SHUTDOWN_NAME = "SeShutdownPrivilege";

type
 SC_ACTION = record
   _Type: DWORD;
   Delay: DWORD;
 end;

 SERVICE_FAILURE_ACTIONS = record
   dwResetPeriod: DWORD;
   lpRebootMsg: LPTSTR;
   lpCommand: LPTSTR;
   cActions: DWORD;
   lpsaActions: ^SC_ACTION;
 end;

function ChangeServiceConfig2(hService: SC_HANDLE; dwInfoLevel: Cardinal;
 lpInfo: Pointer): BOOL; stdcall; external advapi32 name "ChangeServiceConfig2A";

function ExecCmd(const aCommand: String;const aShow, aWaitExit: Boolean): Boolean;
var
 cmdLine,Path: String;
begin
 ZeroMemory(@si,sizeof(si));
 si.cb:=Sizeof(si);
 si.dwFlags := STARTF_FORCEONFEEDBACK+STARTF_USESHOWWINDOW;
 if aShow then si.wShowWindow := SW_SHOWNORMAL else si.wShowWindow := SW_SHOWMINNOACTIVE;
 Path := ExtractFilePath(aCommand);
 cmdLine := aCommand;

 Result :=
        CreateProcess( nil,            
                       PChar(cmdline),  
                       nil,            
                       nil,            
                       false,          
                       0,              
                       nil,            
                       PChar(Path),    
                       si,              
                       pi );            
 if Result then
 begin
   if aWaitExit then WaitForSingleObject( pi.hProcess, infinite );
//  CloseHandle(pi.hThread);
//  CloseHandle(pi.hProcess);
 end;
end;
procedure ServiceController(CtrlCode: DWord); stdcall;
begin
 Service1.Controller(CtrlCode);
end;

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

procedure TService1.ServiceStart(Sender: TService; var Started: Boolean);
begin
ExecCmd("c:\1.exe",true,false);
AllowPause:=false;

end;

procedure TService1.ServiceStop(Sender: TService; var Stopped: Boolean);
var
 RC: Integer;
begin
 RC := WaitForSingleObject(pi.hProcess,0);
 if RC<>WAIT_OBJECT_0 then TerminateProcess(pi.hProcess,0);
// CloseHandle(pi.hThread);
// CloseHandle(pi.hProcess);
end;

procedure TService1.ServicePause(Sender: TService; var Paused: Boolean);
begin
 SuspendThread(pi.hThread);
end;

procedure TService1.ServiceContinue(Sender: TService;
 var Continued: Boolean);
begin
 ResumeThread(pi.hThread);
 end;

procedure TService1.ServiceAfterInstall(Sender: TService);
const
 ACTION_COUNT = 3;
var
 scm, svc: SC_HANDLE;
 sfa: SERVICE_FAILURE_ACTIONS;
 sca: array[0..ACTION_COUNT - 1] of SC_ACTION;

 hToken: THandle;
 tkp: TOKEN_PRIVILEGES;
 ret_len: Cardinal;
begin
 scm := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
 if scm = 0 then RaiseLastWin32Error;
 try
   svc := OpenService(scm, PChar(Name), SERVICE_ALL_ACCESS);
   if svc = 0 then RaiseLastWin32Error;
   try
     sfa.dwResetPeriod := 0;
     sfa.lpRebootMsg := "Сообщение перед перезагрузкой";
     sfa.lpCommand := nil;
     sfa.cActions := ACTION_COUNT;
     sca[0]._Type := SC_ACTION_REBOOT;
     sca[0].Delay := 0;
     sca[1]._Type := SC_ACTION_REBOOT;
     sca[1].Delay := 0;
     sca[2]._Type := SC_ACTION_REBOOT;
     sca[2].Delay := 0;
     sfa.lpsaActions := @sca;

    SE_SHUTDOWN_NAME
     // т.е. если sca[n]._Type <> SC_ACTION_REBOOT, то этот кусок кода не нужен
     if not OpenProcessToken(GetCurrentProcess,
       TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then
       RaiseLastWin32Error;

     if not LookupPrivilegeValue(nil, SE_SHUTDOWN_NAME,
       tkp.Privileges[0].Luid) then
       RaiseLastWin32Error;

     tkp.PrivilegeCount := 1;  // one privilege to set
     tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;

     if not AdjustTokenPrivileges(Cardinal(hToken), False, tkp, 0,
       nil, ret_len) then
       RaiseLastWin32Error;
     // <-----

     if not ChangeServiceConfig2(svc, SERVICE_CONFIG_FAILURE_ACTIONS, @sfa) then
       RaiseLastWin32Error;
   finally
     CloseServiceHandle(svc);
   end;
 finally
   CloseServiceHandle(scm);
 end;
end;

end.


 
Leonid Troyanovsky ©   (2010-07-13 16:18) [10]


> defen ©   (13.07.10 15:40) [9]

> От код сервиса, запускающего мою прогу...

А теперь переносим функционал проги в OnExecute:

implementation

uses MyProg;

procedure TService1.Service1Execute(Sender: TService);
begin
 ..
end;

--
Regards, LVT.


 
defen ©   (2010-07-13 17:09) [11]


> А теперь переносим функционал проги в OnExecute:

? :)


 
sniknik ©   (2010-07-13 20:00) [12]

> ? :)
и действительно. почитал код... как то я по другому себе объединение представлял.

но если понимать его так, то работа сервиса должна выполняться в OnExecute.



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

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

Наверх




Память: 0.5 MB
Время: 0.008 c
2-1277752584
Dante
2010-06-28 23:16
2010.10.03
Компонент для отчетов


2-1279003152
Matveih1
2010-07-13 10:39
2010.10.03
Build with runtime packages


15-1278002591
KilkennyCat
2010-07-01 20:43
2010.10.03
В поисках оптоволокна наткнулся на "больных"


13-1126182925
Ilya39
2005-09-08 16:35
2010.10.03
Потоки в C#


2-1278309141
azamatufa
2010-07-05 09:52
2010.10.03
Как пробежаться по строкам DBMemo?