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

Вниз

Как определить запускают программу как сервис или приложение?   Найти похожие ветки 

 
-=GUEST=-   (2005-06-04 18:53) [0]

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

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

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


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

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


 
sniknik ©   (2005-06-04 22:19) [2]

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


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

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

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


 
sniknik ©   (2005-06-04 23:36) [4]

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


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

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


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

-=GUEST=-   (04.06.05 18:53)

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


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

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


 
sniknik ©   (2005-06-05 12:59) [8]

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

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

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


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

>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 13:44) [10]

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


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

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

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

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

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

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


 
DiamondShark ©   (2005-06-05 15:31) [12]


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

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


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

>-=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;




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

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

Наверх




Память: 0.5 MB
Время: 0.026 c
3-1116855321
parasolka
2005-05-23 17:35
2005.06.29
Вставка данных в таблицу.


3-1116417314
juice
2005-05-18 15:55
2005.06.29
Отладка в IB Expert


4-1115251787
ronyn
2005-05-05 04:09
2005.06.29
Как переташить файл на к.л. компонент программы?


14-1117710930
Andy BitOff
2005-06-02 15:15
2005.06.29
MakeCab.exe


1-1117722173
Demonix
2005-06-02 18:22
2005.06.29
Обработка сообщений Outloook