Delphi - A Feladatütemező programozása Delphi-ből

ITaskScheduler 2. rész

forráskód letöltése
A cikksorozat előző részében a Feladatütemező indításával és leállításával foglalkoztunk. A második részben már konkrétan rátérünk a Feladatütemező programozására, így megvizsgáljuk, hogy hogyan tudjuk lekérdezni a célszámítógép nevét, az ütemezett feladatok listáját, egy feladat adatait, valamint azt, hogy hogyan tudjuk törölni a kiválasztott feladatot, illetve hogyan tudunk újat létrehozni.
A Feladatütemezőt több interfészen keresztül tudjuk programozni, a leglényegesebb ezek közül az ITaskScheduler interfész. Ezen az interfészen keresztül érhetjük el a többi interfészt is, ezért rögtön a program indulásakor létrehozunk egy ITaskScheduler típusú objektumot.
Mivel COM objektumokkal fogunk dolgozni (Component Object Model), az első dolog kell, hogy legyen, a CoInitialize függvény meghívása. Ezután már a CreateCOMObject függvénnyel létrehozhatjuk az ITaskScheduler objektumunkat:
  CoInitialize(nil);
  FTaskScheduler:=CreateCOMObject(CLSID_CTaskScheduler) as ITaskScheduler;
Figyelnünk kell arra, hogy programból való kilépés előtt a CoUninitialize függvényt is meg kell majd hívnunk, ezért ezt a Form OnDestroy eseményénél tesszük meg.
A függvények visszatérési értéke minden esetben HRESULT típusú. Használhatjuk az alábbi konstansokat a visszatérési érték kiértékelésére, de egyszerűbb a Succeeded függvény használata, ahogy az a mellékelt példaprogramban is látható. A konstansok:
  • S_OK: a lekérdezés sikeres volt.
  • E_INVALIDARG: hibásan lett megadva a paraméter.
  • E_OUTOFMEMORY: nincs elég memória a művelethez.
A RefreshAll eljárásban lekérdezzük a célszámítógép nevét, valamint beolvassuk egy ListBox komponensbe az ütemezett feladatokat. Előbbihez a GetTargetComputer függvényt használjuk, míg utóbbihoz szükségünk lesz egy IEnumWorkItems interfészre, amelyet az ITaskScheduler Enum függvényével kapunk meg.
GetTargetComputer
Osztály: ITaskScheduler
HRESULT GetTargetComputer(
LPWSTR *ppwszComputer
);
A paraméterként megadott LPWSTR típusú változóba lekérdezi a célszámítógép nevét.
Paraméterek
LPWSTR *ppwszComputer
LPWSTR típusú paraméter, amelyben a számítógép nevét fogjuk megkapni. Miután a kapott változóból kiolvastuk (feldolgoztuk) a lekérdezett adatot, a változó által lefoglalt memóriát fel kell szabadítani a CoTaskmemFree függvénnyel.
SetTargetComputer
Osztály: ITaskScheduler
HRESULT SetTargetComputer(
LPCWSTR pwszComputer
);
A GetTargetComputer függvény párja, amellyel a célszámítógép nevét tudjuk megadni.
Paraméterek
LPCWSTR pwszComputer
A számítógép neve UNC (Universal Naming Convention) formátumnak megfelelően. Ha a helyi számítógépet akarjuk megadni, akkor az értéke lehet nil is.
Enum
Osztály: ITaskScheduler
HRESULT Enum(
IEnumWorkItems **ppEnumTasks
);
Ezzel a függvénnyel kaphatjuk meg a feladatok lekérdezéséhez szükséges IEnumWorkItems interfészt.
Paraméterek
IEnumWorkItems **ppEnumTasks
Egy IEnumWorkItems típusú változót kell megadni, amiben az objektumot fogjuk megkapni.
Next
Osztály: IEnumWorkItems
function Next(
celt: ULONG;
out rgpwszNames: PLPWSTR;
out pceltFetched: ULONG
): HRESULT;
Lekérdezi a soron következő elemeket.
Paraméterek
celt: ULONG
A lekérdezendő elemek száma. Ezt általában a TASKS_TO_RETRIEVE konstanssal szoktuk megadni, aminek értéke 5, tehát a soron következő 5 elem nevét kapjuk meg.
out rgpwszNames: PLPWSTR
Egy pointer a lekérdezett nevekre, vagyis egy olyan tömbre, amelynek elemei PWideChar típusúak. A feldolgozás után a tömb elemeit, és magát a tömböt is fel kell szabadítani a CoTaskMemFree függvénnyel.
out pceltFetched: ULONG
A lekérdezett nevek száma. Ez nem minden esetben egyezik meg a celt paraméter értékével, hiszen lehet, hogy mi a soron következő 5 elemet szeretnénk lekérdezni, de már csak 3 van hátra.
Skip
Osztály: IEnumWorkItems
function Skip(
celt: ULONG
): HRESULT;
Átlépi a soron következő megadott számú elemet.
Paraméterek
celt: ULONG
Ennyi elemet fog átlépni.
Reset
Osztály: IEnumWorkItems
function Reset: HRESULT;
Alaphelyzetbe állítja az enumeratort. Ez azt jelenti, hogy a beolvasás újból az első elemtől történik. Akkor használjuk, ha előzőleg nem olvastuk be az összes elemet, és a beolvasást elölről szeretnénk kezdeni.
Clone
Osztály: IEnumWorkItems
function Clone(
out pEnumWorkItems: IEnumWorkItems
): HRESULT;
Létrehoz egy újabb IEnumWorkItems típusú objektumot, ami az eredeti pontos másolata lesz. Használható például „könyvjelző” funkcióra.
Paraméterek
out pEnumWorkItems: IEnumWorkItems
Egy IEnumWorkItems típusú változót kell megadni paraméterként.
Amikor a ListBox-ból kiválasztunk egy elemet, akkor annak tulajdonságai megjelennek a lista alatti mezőben. A feladat adatainak lekérdezéséhez szükség van egy ITask interfészre, amit az ITaskScheduler interfész Activate függvényével kaphatunk meg.
Activate
Osztály: ITaskScheduler
HRESULT Activate(
LPCWSTR pwszName,
REFIID riid,
IUnknown **ppunk
);
A függvény segítségével a megadott feladat ITask interfészéhez juthatunk hozzá, aminek segítségével lekérdezhetjük vagy beállíthatjuk annak adatait.
Paraméterek
LPCWSTR pwszName
A feladat neve.
REFIID riid
Az interfész azonosítója. Jelenleg csak az ITask interfész támogatott, amelynek azonosítóját az IID_ITask konstanssal tudjuk megadni.
IUnknown **ppunk
Ebbe az objektumba kapjuk meg az ITask interfészt.
Ha megvan az ITask interfész, akkor már könnyedén hozzáférhetünk az adatokhoz, szükség esetén módosíthatjuk is azokat. Az alábbiakban az ITask interfész függvényeit ismertetjük:
SetParameters
Osztály: ITask
function SetParameters(
pwszParameters: PWideChar
): HRESULT;
Ha a feladatnak (alkalmazásnak) szüksége van paraméterekre, akkor azt ennek a függvénynek a segítségével adhatjuk meg.
Paraméterek
pwszParameters: PWideChar
A paraméter-sztringre mutató pointer.
GetParameters
Osztály: ITask
function GetParameters(
out ppwszParameters: PWideChar
): HRESULT;
Az alkalmazás paraméterlistájának lekérdezésére szolgáló függvény.
Paraméterek
out ppwszParameters: PWideChar
Ebben a paraméterben kapjuk meg az alkalmazás paramétereit. Ha feldolgoztuk az adatokat, akkor a CoTaskmemFree függvénnyel fel kell szabadítani a lefoglalt területet.
SetApplicationName
Osztály: ITask
function SetApplicationName(
pwszApplicationName: PWideChar
): HRESULT;
Megadja a feladat futtatható fájljának elérési útvonalát és nevét.
Paraméterek
pwszApplicationName: PWideChar
A program elérési útvonala és neve.
GetApplicationName
Osztály: ITask
function GetApplicationName(
out ppwszApplicationName: PWideChar
): HRESULT;
Lekérdezi a feladat futtatható fájljának nevét.
Paraméterek
out ppwszApplicationName: PWideChar
Ebben a paraméterben kapjuk meg a fájl nevét.
SetWorkingDirectory
Osztály: ITask
function SetWorkingDirectory(
pwszWorkingDirectory: PWideChar
): HRESULT;
Az alkalmazás munka könyvtárának beállításához használhatjuk ezt a függvényt.
Paraméterek
pwszWorkingDirectory: PWideChar
A könyvtár elérési útvonala.
GetWorkingDirectory
Osztály: ITask
function GetWorkingDirectory(
out ppwszWorkingDirectory: PWideChar
): HRESULT;
Lekérdezi a munka könyvtár elérési útvonalát.
Paraméterek
out ppwszWorkingDirectory: PWideChar
Ebben a paraméterben kapjuk meg az elérési útvonalat.
SetPriority
Osztály: ITask
function SetPriority(
dwPriority: DWORD
): HRESULT;
A feladat prioritását adhatjuk meg a függvény segítségével. Csak Windows NT/2000 alatt használható. A prioritás határozza meg, hogy az operációs rendszer mennyi időt szán az adott processzre.
Paraméterek
dwPriority: DWORD
A prioritást adhatjuk meg ebben a paraméterben. Ugyanazokat az értékeket használhatjuk, amelyeket a CreateProcess függvénynél. Az egyszerűség kedvéért a prioritást megadhatjuk konstansokkal is:
  • REALTIME_PRIORITY_CLASS
  • HIGH_PRIORITY_CLASS
  • NORMAL_PRIORITY_CLASS
  • IDLE_PRIORITY_CLASS
GetPriority
Osztály: ITask
function GetPriority(
out pdwPriority: DWORD
): HRESULT;
A prioritást kérdezhetjük le a függvény segítségével.
Paraméterek
out pdwPriority: DWORD
Ebben a paraméterben kapjuk meg az eredményt.
SetTaskFlags
Osztály: ITask
function SetTaskFlags(
dwFlags: DWORD
): HRESULT;
Ez a függvény a jövőben a taszk egyes tulajdonságainak beállítására szolgál majd, jelenleg nem használt.
Paraméterek
dwFlags: DWORD
Ebben a paraméterben lehet majd megadni a tulajdonságokat.
GetTaskFlags
Osztály: ITask
function GetTaskFlags(
out pdwFlags: DWORD
): HRESULT;
A függvény a taszk flag-jeinek lekérdezésére szolgál. Mivel ez még nem használt lehetőség, így nem kapunk használható eredményt.
Paraméterek
out pdwFlags: DWORD
Ebben a paraméterben kapnánk meg az eredményt.
SetMaxRunTime
Osztály: ITask
function SetMaxRunTime(
dwMaxRunTimeMS: DWORD
): HRESULT;
Ezzel a függvénnyel beállíthatjuk, hogy a feladat maximum mennyi ideig futhat. Ha túllépné ezt az időt, akkor a Feladatütemező leállítja.
Paraméterek
dwMaxRunTimeMS: DWORD
Ebben a paraméterben adhatjuk meg az időt ezredmásodpercben. Ha nem akarunk időkorlátot, akkor adjuk meg az INFINITE konstanst paraméterként.
GetMaxRunTime
Osztály: ITask
function GetMaxRunTime(
out pdwMaxRunTimeMS: DWORD
): HRESULT;
Lekérdezi azt az időtartamot, amennyi ideig az adott taszk futhat. Ha a futási idő ezt túllépi, akkor a Feladatütemező automatikusan leállítja a programot.
Paraméterek
out pdwMaxRunTimeMS: DWORD
Ebben a paraméterben kapjuk meg az időtartamot ezredmásodpercben.

ITaskScheduler cikksorozat