![]() |
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 ![]() Hat jemand von Euch eine Idee oder hat die besagte Unit zum laufen gebracht? |
Re: Programm in geplante Tasks eintragen
Zitat:
:hi: |
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: |
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:
Weißt Du voran das liegt?
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; |
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:
aus der MsTasks-Unit. Guck mal nach, woher in deinem Fall das
HR := SchedulingAgent.NewWorkItem(StrToWide(TaskName), CLSID_CTask,
IID_IScheduledWorkItem, WorkItem); Zitat:
|
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:
|
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:
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:
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!'); ...
Delphi-Quellcode:
Vielleicht hat da noch jemand nen Tipp.
// 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; Have fun with it - Xanadu |
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:
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?
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); 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 |
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:
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.
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; 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 |
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