Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Programm in geplante Tasks eintragen (https://www.delphipraxis.net/46764-programm-geplante-tasks-eintragen.html)

Albi 31. Mai 2005 08:19


Programm in geplante Tasks eintragen
 
Hallo,

ich habe mir ein kleines Programm geschrieben, das von einer DB nach einer gewissen Zeit ein Backup fahren soll.

Ich will nun, dass man dem Programm sagt, es soll 7 Tage ein Backup fahren und diese Einstellungen nun die geplanten Tasks geschrieben werden. Und stehe ich nun vor dem Problem, dass ich nicht weiss, wie ich dem Programm sagen soll, den Dienst einzutragen.

Ich habe mir schon das "Task Scheduler Demo" auf der der Jedi-Seite angeschaut aber das ist in der msTask.pas ein Fehler und ich weiß nicht wo dieser liegt. Also konnte ich damit nicht allzuvile anfangen.

Hat jemand von Euch eine Idee oder hat die besagte Unit zum laufen gebracht?

jensw_2000 31. Mai 2005 08:37

Re: Programm in geplante Tasks eintragen
 
Zitat:

Hat jemand von Euch eine Idee oder hat die besagte Unit zum laufen gebracht?
Nicht direkt, aber du kannst den Task über den AT Befehl (NT-basierte OS) und Shellexecute planen.
:hi:

MathiasSimmack 31. Mai 2005 08:49

Re: Programm in geplante Tasks eintragen
 
Der einzige "Fehler", den ich im Jedi-Beispiel erkennen kann, ist die Tatsache, dass die Unit in einem anderen Ordner liegt als die Demo. Und weil der Unitpfad nicht in den Projektoptionen steht, meckert der Compiler, weil er die Unit nicht findet.

Lösung: Du kopierst die Unit aus "Pas" nach "Demos", und das Programm lässt sich problemlos kompilieren. Das Ding funktioniert sogar. :shock:

Albi 31. Mai 2005 10:22

Re: Programm in geplante Tasks eintragen
 
Hallo,

das habe ich auch mitbekommen, das war ja nicht so schwer :-D . Wenn ich das Demo aber Compilieren will, bekomme EV und zwar in dieser Procedure.

Code:
procedure TfrmMain.btnNewWorkItemClick(Sender: TObject);
var
  HR: HRESULT;
  TaskName: string;
  WorkItem: IUnknown;
  g: TIID;
begin
  TaskName := InputBox('Enter Task Name', 'Name?', '');
  if TAskName = '' then
  begin
    ShowMessage('You have to enter a task name');
    exit;
  end;
  Init;
  g:= IID_ITask;
  HR := SchedulingAgent.NewWorkItem(StrToWide(TaskName), g, IID_IScheduledWorkItem);//hier kommt der Fehler
  Task := ITask(WorkItem); //required for save
  ScheduledWorkItem := IScheduledWorkItem(WorkItem);
  if HR = S_OK then StatusMemo.Lines.Add(Taskname + ' created successfully')
  else
  begin
    StatusMemo.Lines.Add('Could not create the job ' + taskname + ' Error Code :' + IntTohex(hr, 8));
    exit;
  end;
  hr := SaveTAsk;
  if hr <> S_OK then StatusMemo.lines.add('Save task failed with error code' + IntTohex(hr, 8) + #13#10);
  BtnGetTasksClick(self); //for updating
end;
Weißt Du voran das liegt?

MathiasSimmack 31. Mai 2005 11:35

Re: Programm in geplante Tasks eintragen
 
Hast du in dem Quellcode rumgefummelt? :gruebel: Die Version, die ich mir vorhin runtergeladen habe, enthält statt der Variablen "g" eine Konstante:
Delphi-Quellcode:
  HR := SchedulingAgent.NewWorkItem(StrToWide(TaskName), CLSID_CTask,
    IID_IScheduledWorkItem, WorkItem);
aus der MsTasks-Unit. Guck mal nach, woher in deinem Fall das
Zitat:

Delphi-Quellcode:
g:= IID_ITask

kommt.

Albi 31. Mai 2005 12:28

Re: Programm in geplante Tasks eintragen
 
Ja, ein wenig. Ich habe hier ín der DP etwas dazu gelesen und man sollte das so machen, dann war zumindest der eine Fehler von weg.

jetzt schimpft Delphi auch noch in der Function GetITask und btnNewWorkItemClick.

Zitat:

Zitat von von Delphi
Fehlermeldung: [Fehler] main.pas(890): Konstantenobjekt kann nicht als Var-Parameter weitergegeben werden

Habe ich da etwa ein anderes Demo? :gruebel:

Xanadu 28. Jun 2005 22:20

Re: Programm in geplante Tasks eintragen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Bei mir läuft TTaskScheduler gut. Hänge die Version die bei mir unter Delphi 5 tut dazu.

Das ganze läuft auch remote super um auf einen anderen Netzpc Tasks zu Schedulen (bsp. \\MyClientPC). Damit time ich ca. 50 TV-Aufnahmen pro Woche auf meinem PC-VCR mit Hauppauge-Karte und check auch auf etwaige Zeitüberschneidungen.

Delphi-Quellcode:
constructor TTaskScheduler.Create;
...
  // Changed by Bernd Linthe to connect to a different computers scheduler
  if FAgent.SetTargetComputer(StrToWide('\\' + Account)) <> S_OK then
    if FAgent.SetTargetComputer(StrToWide('\\' + GetLocalComputerName)) <> S_OK then
      showmessage('WHOOPS! Computername fehlt!');
...
Das Einzige Problem das ich mit TTaskScheduler habe ist, dass die Flags TASK_FLAG_RESTART_ON_IDLE_RESUME = ($800) und TASK_FLAG_SYSTEM_REQUIRED = ($1000) nicht gesetzt werden. Habe dazu folgendes in TaskSched.pas geändert, tut aber nicht. Das Häkchen "Computer zum Ausführen des Tasks reaktivieren" muss ich noch MTV (=mit te vingers) setzen und das nervt ein wenig:

Delphi-Quellcode:
// Additional by Bernd Linthe
function TTaskSchedulerTask.GetRestartOnIdleResume : Boolean;
var
  Flags : DWORD;
begin
  GetITask.GetTaskFlags(Flags);
  Result := (Flags and TASK_FLAG_RESTART_ON_IDLE_RESUME) = 0;
end;

//Additional by Bernd Linthe
procedure TTaskSchedulerTask.SetRestartOnIdleResume(Value : Boolean);
var
  Flags : DWORD;
  iiTask : ITask;
begin
  iiTask := GetITask;

  iiTask.GetTaskFlags(Flags);

  if not Value then
    Flags := Flags or TASK_FLAG_RESTART_ON_IDLE_RESUME
  else
    Flags := Flags and (not TASK_FLAG_RESTART_ON_IDLE_RESUME);

  iiTask.SetTaskFlags(Flags);
  Tasks.ISave(iiTask);
end;

// Additional by Bernd Linthe
function TTaskSchedulerTask.GetSystemRequired : Boolean;
var
  Flags : DWORD;
begin
  GetITask.GetTaskFlags(Flags);
  Result := (Flags and TASK_FLAG_SYSTEM_REQUIRED) = 0;
end;

//Additional by Bernd Linthe
procedure TTaskSchedulerTask.SetSystemRequired(Value : Boolean);
var
  Flags : DWORD;
  iiTask : ITask;
begin
  iiTask := GetITask;

  iiTask.GetTaskFlags(Flags);

  if not Value then
    Flags := Flags or TASK_FLAG_SYSTEM_REQUIRED
  else
    Flags := Flags and (not TASK_FLAG_SYSTEM_REQUIRED);

  iiTask.SetTaskFlags(Flags);
  Tasks.ISave(iiTask);
end;
Vielleicht hat da noch jemand nen Tipp.

Have fun with it - Xanadu

c.wuensch 15. Aug 2007 17:45

Re: Programm in geplante Tasks eintragen
 
Hi Xanadu,

ist zwar schon etwas länger her, dass der Thread geöffnet wurde, aber da ich auch gerade ein Problem mit den Flags habe, schreibe ich mal hier rein:

1.) Ist in deinem Code zufällig das NOT zuviel?
Delphi-Quellcode:
  if [color=#FF0000][b]not[/b][/color] Value then
    Flags := Flags or TASK_FLAG_SYSTEM_REQUIRED
  else
    Flags := Flags and (not TASK_FLAG_SYSTEM_REQUIRED);
Für mich würde es mehr Sinn machen, wenn das entsprechende Bit auf 1 gesetzt würde (mit OR) bei Value=true. Oder liege ich da jetzt falsch?

2.) Mir ist aufgefallen, dass es den Windows-Taskplaner überhaupt nicht interessiert, was für ein Wert bei Flags gesetzt ist, und umgekehrt ändert sich der Flags-Wert auch nicht, wenn man die Checkboxen des Tasks manuell an- oder ausschaltet.
Stimmt da vielleicht irgendetwas bei der Übernahme dieses Flags-Wertes nicht?

Falls du inzwischen eine Lösung gefungen hast, dann lass mich doch bitte daran teilhaben ;-)

CU, Chris

Xanadu 18. Aug 2007 11:23

Re: Programm in geplante Tasks eintragen
 
Hi Chris,

danke für den Tipp, ich werde das mit dem "NOT" ausprobieren.

Zwischenzeitlich hab ich mal versucht das Flag in den *.Job Dateien von Hand zu setzen aber das hilft auch nicht wirklich weiter.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  f: file of Char;
  C: char;
  sr: TSearchRec;
  FileAttrs: Integer;
  i: integer;
  Path: string;
begin
  FileAttrs := 0;
  FileAttrs := FileAttrs + faHidden;
  FileAttrs := FileAttrs + faSysFile;
  FileAttrs := FileAttrs + faVolumeID;
  FileAttrs := FileAttrs + faDirectory;
  FileAttrs := FileAttrs + faArchive;
  FileAttrs := FileAttrs + faAnyFile;
  C:= #16; // Wert für Option: Computer zum Ausführen des Tasks reaktivieren.

  for i:= 0 to Memo1.Lines.Count - 1 do
  begin

    if (ExtractFileExt(Memo1.Lines[i]) = '.job') then // z.B. 'N:\WINNT\Tasks\DVB_0_1390*.job';
    begin
      Path:= ExtractFilePath(Memo1.Lines[i]);
      if (FindFirst(Memo1.Lines[i], FileAttrs, sr) = 0) then
      begin
        AssignFile(f, Path + sr.Name);
        Reset(f);
        Seek(f,49); // Position in Datei.
        write(f,C);
        CloseFile(f);
        memo2.Lines.Add('Flag gesetz: ' + sr.Name);
        while FindNext(sr) = 0 do
        begin
          AssignFile(f, Path + sr.Name);
          Reset(f);
          Seek(f,49);
          write(f,C);
          CloseFile(f);
          memo2.Lines.Add('Flag gesetz: ' + sr.Name);
        end;
        FindClose(sr);
      end
      else
        memo2.Lines.Add('*** keine Tasks für: ' + Memo1.Lines[i]);
    end
    else
      memo2.Lines.Add('*** falsche Maske: ' + Memo1.Lines[i]);
  end
end;
Da muss auch noch irgendein Wurm mit dem Benutzer und den Rechten drin sein. Wenn Du die Flags für den Job im Dialog änderst wirst Du nämlich auch nach dem Benutzer und dem Kennwort gefragt und ich vermute das es daran liegt das die Flags ohne gültigen Account garnicht weggeschrieben werden. Ich finde nur leider aktuell keine Zeit an dem Thema dran zu bleiben. Aber an der Ecke würde ich Dir empfehlen mal weiter zu suchen.

Du kannst mich dann gerne auf dem Laufenden halten und wenn ich zu den Flags noch was raus bekomme geb ich Dir umgehend Bescheid.

Gruß, Bernd

c.wuensch 18. Aug 2007 14:41

Re: Programm in geplante Tasks eintragen
 
Das ist natürlich auch eine Idee, die .job-Datei selbst zu verändern...

Das werde ich bei Gelegenheit mal ausprobieren, stelle ich mir aber kompliziert vor, da diese Files ja binär gespeichert werden.

Es muss aber eine Möglichkeit geben, die Flags zu ändern, denn der DVBViewer (ist auch mit Delphi geschrieben) kann das nämlich auch.

Cu, Chris


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:50 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz