AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Programm in geplante Tasks eintragen
Thema durchsuchen
Ansicht
Themen-Optionen

Programm in geplante Tasks eintragen

Ein Thema von Albi · begonnen am 31. Mai 2005 · letzter Beitrag vom 18. Aug 2007
Antwort Antwort
Albi

Registriert seit: 4. Mai 2003
Ort: Berlin
458 Beiträge
 
Delphi 7 Professional
 
#1

Programm in geplante Tasks eintragen

  Alt 31. Mai 2005, 08:19
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?
Gruß

Albi
  Mit Zitat antworten Zitat
jensw_2000
(Gast)

n/a Beiträge
 
#2

Re: Programm in geplante Tasks eintragen

  Alt 31. Mai 2005, 08:37
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.
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#3

Re: Programm in geplante Tasks eintragen

  Alt 31. Mai 2005, 08:49
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.
  Mit Zitat antworten Zitat
Albi

Registriert seit: 4. Mai 2003
Ort: Berlin
458 Beiträge
 
Delphi 7 Professional
 
#4

Re: Programm in geplante Tasks eintragen

  Alt 31. Mai 2005, 10:22
Hallo,

das habe ich auch mitbekommen, das war ja nicht so schwer . 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?
Gruß

Albi
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#5

Re: Programm in geplante Tasks eintragen

  Alt 31. Mai 2005, 11:35
Hast du in dem Quellcode rumgefummelt? 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:
g:= IID_ITask
kommt.
  Mit Zitat antworten Zitat
Albi

Registriert seit: 4. Mai 2003
Ort: Berlin
458 Beiträge
 
Delphi 7 Professional
 
#6

Re: Programm in geplante Tasks eintragen

  Alt 31. Mai 2005, 12:28
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 von von Delphi:
Fehlermeldung: [Fehler] main.pas(890): Konstantenobjekt kann nicht als Var-Parameter weitergegeben werden
Habe ich da etwa ein anderes Demo?
Gruß

Albi
  Mit Zitat antworten Zitat
Xanadu

Registriert seit: 8. Mai 2005
Ort: Schwäbisch Gmünd
20 Beiträge
 
Delphi 5 Enterprise
 
#7

Re: Programm in geplante Tasks eintragen

  Alt 28. Jun 2005, 22:20
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
Angehängte Dateien
Dateityp: zip taskscheduler_187.zip (27,4 KB, 107x aufgerufen)
  Mit Zitat antworten Zitat
c.wuensch

Registriert seit: 19. Dez 2004
Ort: Münster
96 Beiträge
 
#8

Re: Programm in geplante Tasks eintragen

  Alt 15. Aug 2007, 17:45
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
  Mit Zitat antworten Zitat
Xanadu

Registriert seit: 8. Mai 2005
Ort: Schwäbisch Gmünd
20 Beiträge
 
Delphi 5 Enterprise
 
#9

Re: Programm in geplante Tasks eintragen

  Alt 18. Aug 2007, 11:23
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
  Mit Zitat antworten Zitat
c.wuensch

Registriert seit: 19. Dez 2004
Ort: Münster
96 Beiträge
 
#10

Re: Programm in geplante Tasks eintragen

  Alt 18. Aug 2007, 14:41
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:10 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz