Hi, hab noch ein Problemchen mit dem TaskScheduler.
Zwar gibt es zwei Beitäge zu dem Thema allgemein bei Euch
Geplanten Task in Windows erstellen und
Programm in geplante Tasks eintragen aber die decken mein Problem nicht ab.
Ich habe die
JEDI MsTask.pas bzw. Christian Ruocco´s
TaskSched.pas eingebunden und kann auch Tasks anlegen. Allerdings wird das Flag: TASK_FLAG_SYSTEM_REQUIRED nicht gesetzt. Das bedeutet der Task wird nicht ausgeführt weil in den Task-Eigenschaften im Reiter: "Einstellungen" bei der "Energieverwaltung" die Option: "Computer zum Ausführen des Tasks reaktivieren" nicht markiert ist. Das krieg ich im Coding nicht hin.
Ausserdem kann ich auch keinen abweichenden Account via
Task.SetAccountInformation angeben. Die Funktionen laufen zwar beim Debuggen fehlerfrei und liefern auch die richtigen Rückgabewerte, aber im Task ist nichts drin. Wenn ich nachher manuell mit Task.Edit rein gehe kann ich´s allerdings setzen und auch speichern. Dann tut es auch sauber.
Weil ich über mein Programm jede Menge Videoaufnahmen über ein Derrivat der TV_Movie Datenbank time ist das manuelle Checken nervig weil mit nem Hauffen clicks verbunden.
Ich vermute mal ich hab was ganz banales übersehen und vermute auch dass beide Probleme die gleiche Ursache haben könnten, bräuchte aber dennoch einen Insider-Tipp.
Mein Coding ist:
Delphi-Quellcode:
Task:= Sched.Tasks.Add('DVB_' + IntToStr(FieldValues['ID']));
Task.AppName:= '"' + sWorkDir + '\' + sAppName + '"';
Task.Parameters:= ' /1 ' + tblSenderCodes.FieldValues['SenderCode']
+ ' "' + sRecDir + FieldValues['Title'] + '.mpg" MPG '
+ IntToStr((Hour * 60) + Min) + ' Stop 3000MB';
// bis hier tut alles!
Task.SystemRequired:= True; // tut nicht, fehlert aber auch nicht!
Task.SetAccount(edtAccount.Text,edtPWD.Text); // tut nicht, fehlert aber auch nicht!
// ab hier tut´s auch wieder!
Trigger:= Task.Triggers.Add;
Trigger.HasEndDate:= False;
Trigger.Kind:= tskOnce;
Trigger.StartTime:= FieldValues['StartTime'];
Trigger.Enabled:= true;
// bis hier ist´s auch wieder okay!
Trigger.SystemRequired:= True; // tut nicht, fehlert aber auch nicht!
// und ab hier klappt es dann auch!
Trigger.Save;
Task.Edit; // wenn ich hier manuell ändere funktioniert es.
Weil mein Video-PC eine eigenständige Maschine im heimatlichen Netz ist und als Pentium-II Rechner nicht die richtige Performance für Datenbankselects hat time ich auf einem anderen Rechner. Deshalb brauch ich auch den abweichenden Account den ich in der
TaskSched.pas wie folgt implementiert habe:
Delphi-Quellcode:
function TTaskSchedulerTask.SetAccount(AccountName, PWD: string): boolean;
var
PAccount: Array[0..64] of WideChar;
PPWD: Array[0..64] of WideChar;
hr: HRESULT;
begin
hr:= GetITask.SetAccountInformation(StringToWideChar(AccountName, PAccount, length(AccountName)+1), StringToWideChar(PWD,PPWD, Length(PWD)+1));
if hr = S_OK then
Result:= True
else
begin
Result:= False;
case hr of
E_ACCESSDENIED: ShowMessage('Fehler: Sie besitzen nicht genügend Rechte für diese Operation!');
E_INVALIDARG: ShowMessage('Fehler: Die übergebenen Argumente sind ungültig!');
E_OUTOFMEMORY: ShowMessage('Fehler: Nicht genügend Speicher verfügbar!');
SCHED_E_NO_SECURITY_SERVICES: ShowMessage('Fehler: Security Services nicht unter Win9.x verfügbar!');
SCHED_E_UNSUPPORTED_ACCOUNT_OPTION: ShowMessage('Fehler: TASK_FLAG_RUN_ONLY_IF_LOGGED_ON nicht gesetzt! (PWD: NIL)');
SCHED_E_ACCOUNT_INFORMATION_NOT_SET: ShowMessage('Fehler: ungültiges Passwort!');
else
ShowMessage('unbekannter Fehler!');
end;
end;
end;
Habe in der
TaskSched.pas auch das Flag setzen auf dem TTask statt nur im TTrigger rein gebastelt, hilft aber auch nix obwohl ich
true zurück krieg:
Delphi-Quellcode:
function TTaskSchedulerTask.GetSystemRequired : Boolean;
var
Flags : DWORD;
begin
GetITask.GetTaskFlags(Flags);
Result := (Flags and TASK_FLAG_SYSTEM_REQUIRED) = 0;
end;
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;
Würde mich freuen wenn jemand ne Hilfe geben könnte.
Gruß, Bernd