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

Вниз

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

 
-=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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.078 c
1-1117797070
Mishenka
2005-06-03 15:11
2005.06.29
Как посчитать контрольную сумму файла?


14-1117529818
Jeer
2005-05-31 12:56
2005.06.29
Miss 2005


1-1117631953
Ega23
2005-06-01 17:19
2005.06.29
Абсолютное значение времени


1-1117604664
vidiv
2005-06-01 09:44
2005.06.29
русские надписи на кнопках в диалогах msgdialog.


1-1117972531
Серый
2005-06-05 15:55
2005.06.29
Как построить бинарное дерево с помощью "Тривиев"





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский