Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как определить запускают программу как сервис или приложение? [D5, Win95/98, Win2k]


-=GUEST=- ©   (2005-06-04 18:53:00) 

Есть программа. Может работать и как сервис, и как приложение.
Вопрос:
Можно ли определить что эту программу пытаются запустить как сервис (т.е. его запускает Service Manager), или его запускают как приложение - пользователь щелкнув на иконку.

Сразу напрашивается решение - если сервис, передать параметр
"-s" например (т.е зарегистрировать сервис и в строку запуска внести ПУТЬ_К_ПРОГРАММЕ -s), как в Firebird SQL Server.

Но есть Liga Database Server (сервер юридической базы данных), который умеет это делать без доп. параметров (сам определяет тип запуска).
Как это сделать?


Ученик   (2005-06-05 15:51:00) [1]

>-=GUEST=-   (05.06.05 15:05) [11]

Вариант Win95/98, Win2k, ...


uses
 TlHelp32;

procedure TForm1.Button1Click(Sender: TObject);
var
 i: Integer;
 dwProcessID, dwParentProcessID: DWord;
 hSnapshot: THandle;
 ProcessEntry: TProcessEntry32;
 ProcessList: TStringList;
begin
 ProcessList := TStringList.Create;
 try
   dwProcessID := GetCurrentProcessID;
   dwParentProcessID := 0;
   hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
   if hSnapshot <> INVALID_HANDLE_VALUE then try
     ProcessEntry.dwSize := SizeOf(ProcessEntry);
     if Process32First(hSnapshot, ProcessEntry) then begin
       repeat
         ProcessList.AddObject(ExtractFileName(ProcessEntry.szExeFile), TObject(ProcessEntry.th32ProcessID));
         if ProcessEntry.th32ProcessID = dwProcessID then
           dwParentProcessID := ProcessEntry.th32ParentProcessID;
       until not Process32Next(hSnapshot, ProcessEntry)
     end
   finally
     CloseHandle(hSnapshot)
   end;
   if dwParentProcessID <> 0 then begin
     i := ProcessList.IndexOfObject(TObject(dwParentProcessID));
     if i <> -1 then
       ShowMessage(ProcessList[i])
   end
 finally
   ProcessList.Free
 end
end;


DiamondShark   (2005-06-05 15:31:00) [2]


> Alex Konshin ©   (05.06.05 10:49) [7]
> Вызов сервиса отличается тем что ему не передаются параметры,
> т.е. ParamCount = 0.

Очень даже передаются.


-=GUEST=-   (2005-06-05 15:05:00) [3]

В результате имеем три варианта:

1. По имени пользователя.
  Пример в ($Delphi)\Source\Vcl\ScktSrvr.dpr (Начиная с Delphi5)

2. По запустившему процессу.

3. По передаваемому параметру.
  К сожалению в TServiceApplication такой возможности нет. Но можно подправить установку сервиса в SvcMrg.pas - процедура TServiceApplication.RegisterServices(Install, Silent: Boolean);

И для полноты, как опередить запустивший процесс?


sniknik   (2005-06-05 13:44:00) [4]

а так ты по своему ответу на варианты делиш..., а я их в вопросе ищу.


Ученик   (2005-06-05 13:11:00) [5]

>sniknik ©   (05.06.05 12:59) [8]

Ученик   (04.06.05 22:14) [1]
>-=GUEST=-   (04.06.05 18:53)  
Наверно, по пользователю (SYSTEM) или запустившему процессу (services.exe) - два варианта.

В Borland\Delphi7\Source\Vcl\ScktSrvr.dpr используется определение по имени пользователя


sniknik   (2005-06-05 12:59:00) [6]

Ученик   (04.06.05 23:50) [5]
> Сочуствую :-)
лучше бы обьяснил.
есть программа которая может работать и как приложение и как сервис, от нее есть исходники, в них можно посмотреть как она различает вызовы.
- это один вариант.
и это именно то что описывается в вопросе, то что нужно.

где второй вариант?

Alex Konshin ©   (05.06.05 10:49) [7]
да нет, там посложнее, целая функция написана сторок на 30.


Alex Konshin   (2005-06-05 10:49:00) [7]

Вызов сервиса отличается тем что ему непередаются параметры, т.е. ParamCount = 0.


Eraser   (2005-06-05 00:04:00) [8]

-=GUEST=-   (04.06.05 18:53)

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


Ученик   (2005-06-04 23:50:00) [9]

>sniknik ©   (04.06.05 23:36) [4]
Сочуствую :-)


sniknik   (2005-06-04 23:36:00) [10]

Ученик   (04.06.05 22:27) [3]
в смысле? не вижу чегото здесь деления на варианты.


Ученик   (2005-06-04 22:27:00) [11]

>sniknik ©   (04.06.05 22:19) [2]

Там первый вариант :-)


sniknik   (2005-06-04 22:19:00) [12]

борланд сокет сервер (scktsrvr.exe) тоже умеет, и от него в дельфях есть исходники...


Ученик   (2005-06-04 22:14:00) [13]

>-=GUEST=-   (04.06.05 18:53)  
Наверно, по пользователю (SYSTEM) или запустившему процессу (services.exe)


Наверх

Титульная страница Поиск, карта сайта Написать письмо