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

Вниз

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

 
DremLIN.Ru   (2010-03-18 09:18) [0]

Пишу программу, которая в зависимости от условий, определяемых при запуске, должно инициализироваться и работаеть в 3-х режимах:

1. Как системная служба
2. Как обычное Forms-приложение;
3. Как консольное приложение.
В коде проекта:

 if IsInstalling() or IsStartAsService() then
   RunAsService()
 else
 if IsStartAsConsole() or IsStartAsSchedulerTask() then
   RunAsConsole()
 else
   RunAsApplication();


Первый пункт решился при помощи недавнего обсуждения:
http://delphimaster.net/view/4-1239772550/

Второй пункт - если ни одно условие не соблюдается;

Третий пункт - если родительский процесс - cmd.exe или планировщик.

С определением запуска из консольного интерпритатора - проблем нет.

function IsStartAsConsole(): Boolean;
begin
 ConSDTIn  := GetStdHandle(STD_INPUT_HANDLE);
 ConSTDOut := GetStdHandle(STD_OUTPUT_HANDLE);

 Result := (ConSDTIn <> 0);
//  Result := Result or (ConSTDOut <> 0); // WinXp - Not Zero
end;

А вот с планировщиком - непонятно. Дело в том что в разных версиях виндовс имя родительского процесса приложения, запущенного из-под планировщика, разное (определено опытным путем):

function IsStartAsSchedulerTask(): Boolean;
var
 ParentProcess: string;
begin
 ParentProcess := ParentProcName;
 Result := False;
 Result := Result or AnsiSameText(ParentProcName, "svchost.exe"); //WinXPsp3En
 Result := Result or AnsiSameText(ParentProcName, "winlogon.exe"); //W2ksp3Ru
 Result := Result or AnsiSameText(ParentProcName, "taskeng.exe"); // Win7ProRu
end;


Справочно:

function IsStartAsService(): Boolean;
begin
 Result := AnsiSameText(ParentProcName(), "services.exe");
end;

// Решение взято: http://delphimaster.net/view/4-1239772550/
function ParentProcName: string;
const
ProcessBasicInformation = 0;
var
Info: PROCESS_BASIC_INFORMATION;
dwProcessHandle: dword;
ProcessName: string;
Hndl: THandle;
begin
Result:= "noname";
dwProcessHandle:= GetCurrentProcess;
if NtQueryInformationProcess(dwProcessHandle, ProcessBasicInformation, @Info, SizeOf(Info), nil) = NO_ERROR
  then begin
    Hndl:= OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, Info.uInheritedFromUniqueProcessId);
    if Hndl <> 0 then
      try
        SetLength(ProcessName, MAX_PATH);
        if GetModuleBaseNameA(Hndl, 0, PChar(ProcessName), MAX_PATH) > 0
          then Result:= PChar(ProcessName);
      finally
        CloseHandle(Hndl);
      end;
  end;
end;


В связи с вышеперечисленным вопрос: А нетли универсального, достоверного, не зависящего от версии виндовс, способо определения запуска приложения из-под планировщика виндовс (Task Scheduler)?

PS:
Приходит в голову просто при создании задачи использовать аргументы командной строки, и тем самым не использовать автоматическое распознование...
Я понимаю, что в принципе - это самое простое и быстрое решение проблемы :)

Но, тем не менее, интересует сабжевый вопрос...

Спасибо.


 
Leonid Troyanovsky ©   (2010-03-18 11:43) [1]


> DremLIN.Ru   (18.03.10 09:18)

> Пишу программу, которая в зависимости от условий, определяемых
> при запуске, должно инициализироваться и работаеть в 3-х
> режимах:
>
> 1. Как системная служба
> 2. Как обычное Forms-приложение;
> 3. Как консольное приложение.

Не нужно, IMHO, никакое  автоматическое распознование,
а нужна служба и два клиента: консоль и гуи.

--
Regards, LVT.


 
DremLIN.Ru   (2010-03-20 00:21) [2]


> Не нужно, IMHO, никакое  автоматическое распознование,а
> нужна служба и два клиента: консоль и гуи.

Кому не нужно? Вам?
К существу заданного вопроса это не относится.

У меня проблема решена не красиво и не универсально, но на целевой машинке - все распознается и работает корректно.

Хотя вопрос уже представляет собой скорее академический интерес...


 
Leonid Troyanovsky ©   (2010-03-20 10:49) [3]


> DremLIN.Ru   (20.03.10 00:21) [2]

> К существу заданного вопроса это не относится.

Это заблуждение.

--
Regards, LVT.



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

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

Наверх




Память: 0.48 MB
Время: 0.006 c
8-1234956971
kalexi
2009-02-18 14:36
2014.05.04
Программа OpenGL с кубиком полностью на WinApi! Как?


15-1383683403
Юрий
2013-11-06 00:30
2014.05.04
С днем рождения ! 6 ноября 2013 среда


15-1383518806
DevilDevil
2013-11-04 02:46
2014.05.04
threadvar, _GetTls, FS:tlsArray


15-1383510603
Юрий
2013-11-04 00:30
2014.05.04
С днем рождения ! 4 ноября 2013 понедельник


2-1374567086
Loser
2013-07-23 12:11
2014.05.04
Вызов функции из DLL в методе объекта ( c кодом)