Главная страница
    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.042 c
8-1110308590
New37th
2005-03-08 22:03
2005.06.29
Люди, хэлп ми плиз, спрайты!!!!


1-1117582199
TrueCoder
2005-06-01 03:29
2005.06.29
Ошибка "Out of memory"


1-1117721563
Erik1
2005-06-02 18:12
2005.06.29
Как записать указатель на процедуру в масв?


4-1114784828
max-min
2005-04-29 18:27
2005.06.29
создание форму


3-1116844274
ass1
2005-05-23 14:31
2005.06.29
опять isc4.gdb





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