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

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2014.05.04;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.002 c
15-1383220486
DevilDevil
2013-10-31 15:54
2014.05.04
СТРОКИ НЕ ПОТОКОБЕЗОПАСНЫ


2-1374653973
delphistorm
2013-07-24 12:19
2014.05.04
Как правильнее?


2-1374666583
OZ
2013-07-24 15:49
2014.05.04
функция Format


4-1268893097
DremLIN.Ru
2010-03-18 09:18
2014.05.04
Как достоверно определить что программа запущена из планировщика?


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





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