|
|
//+-----------------------------------------------------
//
// file: test.cxx
//
// Called from main.cxx, this file actually runs the
// test suite on the interfaces. We test the following:
// 2. ITaskScheduler
// 3. ITask
// 4. ITaskTrigger
// 5. IEnumWorkItem
// We sort of test IUnknown, in that we use it to get
// the other interfaces.
//
// History: 10-31-96 created
//
//-------------------------------------------------------
#include <string.h>
#include <tchar.h>
#include <wchar.h>
#include <windows.h>
#include <objbase.h>
#include <initguid.h>
#include <oleguid.h>
#include <mstask.h>
#include <msterr.h>
#include "tint.hxx"
//+------------------------------------------------------
//
// Function: TestISchedAgent
//
// Synopsis: Uh. What it says.
//
// Arguments: None
//
// Returns: S_OK, but typically caller discards as
// implicit cast to void.
//
// History: 10-31-96 created
//--------------------------------------------------------
HRESULT TestISchedAgent() { HRESULT hr = S_OK;
// Tell where we are
// wprintf(L"\n----------------------------------------------\n");
// wprintf(L"Beginning TestISchedAgent\n\n");
//
// SetTargetComputer method
//
LPWSTR szMyHostName, szMyUNCNameBad; DWORD MyHostNameSize;
MyHostNameSize = 32; szMyHostName = (LPWSTR) malloc(32 * sizeof(WCHAR)); szMyUNCNameBad = (LPWSTR) malloc(32* sizeof(WCHAR)); wcscpy(szMyUNCNameBad,L"\\FOO"); // wprintf(L"SetTargetComputer setting computer to %s\n",szMyUNCNameBad);
hr = g_pISchedAgent -> SetTargetComputer((LPCWSTR) szMyUNCNameBad); if (SUCCEEDED(hr)) { wprintf(L"FAILURE! SetTargetComputer on bad name returned %x.\n",hr); } // wprintf(L"SetTargetComputer setting computer to localhost\n");
hr = g_pISchedAgent -> SetTargetComputer(NULL); if (FAILED(hr)) { wprintf(L"FAILURE! SetTargetComputer on good name returned %x.\n\n",hr); } free(szMyUNCNameBad); free(szMyHostName);
//
// Get Target Computer Method
//
LPWSTR lszMyMachine; hr = g_pISchedAgent -> GetTargetComputer(&lszMyMachine); if (FAILED(hr)) wprintf(L"GetTargetComputer returned hr = %x, %s\n\n",hr,lszMyMachine); CoTaskMemFree(lszMyMachine);
//
// NewTask method
//
IUnknown *pIU;
pIU = NULL; hr = g_pISchedAgent -> NewWorkItem(L"foo\bar.job", CLSID_CTask, IID_ITask, &pIU);
// File is not returned as error until it is persisted.
if (pIU) { IPersistFile *pIPF; hr = pIU->QueryInterface(IID_IPersistFile, (void **)&pIPF); if (FAILED(hr)) { pIU->Release(); pIU = NULL; wprintf(L"FAIL! Unable to get an IPersistFile for illegal new task.\n"); } hr = pIPF->Save(NULL, FALSE); if (SUCCEEDED(hr)) { wprintf(L"FAIL! Succeeded on saving bad task name\n"); } pIU->Release(); pIU = NULL; pIPF->Release(); pIPF = NULL; }
if (pIU != 0) { wprintf(L"FAILURE - new illegal task created\n"); pIU -> Release(); pIU = NULL; } else { // wprintf(L"New Task (bad) returned a pIUnknown of NULL\n");
} // wprintf(L"New Task (bad) returned hr = %x\n",hr);
hr = g_pISchedAgent -> NewWorkItem(L"foo.job", CLSID_CTask, IID_ITask, &pIU); if (pIU != 0) { IPersistFile *pIPF;
hr = pIU->QueryInterface(IID_IPersistFile, (void **) &pIPF); if (pIPF) { hr = pIPF->Save(NULL, FALSE); if (FAILED(hr)) { wprintf(L"FAIL! IPersistFile->Save, good task creation %x\n",hr); } pIPF->Release(); pIPF=NULL; } pIU -> Release(); pIU = NULL; } else { wprintf(L"FAILURE! New Task (good) return a pIUnknown of NULL\n"); } // wprintf(L"New Task (good - foo.job) returned hr = %x\n\n",hr);
//
// AddTask Method
//
hr = g_pISchedAgent -> AddWorkItem(L"bar\foo2.job", g_pITask); if (SUCCEEDED(hr)) wprintf(L"FAILURE! Add Task (bad) returned hr = %x\n",hr); hr = g_pISchedAgent -> AddWorkItem(L"foo2.job", g_pITask); if (FAILED(hr)) wprintf(L"FAILURE! Add Task (good - foo2.job) returned hr = %x\n\n",hr);
//
// IsTask method (not currently imp)
//
/*
hr = g_pISchedAgent -> IsTask(L"bar.job"); wprintf(L"IsTask (bad) returned hr = %x\n",hr); hr = g_pISchedAgent -> IsTask(L"foo.job"); wprintf(L"IsTask (good) returned hr = %x\n\n",hr); */ //
// We were going to test Enum here,
// but wait until later when we need it.
//
//
// Delete Method
//
hr = g_pISchedAgent -> Delete(L"foo.job"); if (FAILED(hr)) wprintf(L"FAILURE! Delete foo.job returned hr = %x\n",hr); hr = g_pISchedAgent -> Delete(L"bar.job"); if (SUCCEEDED(hr)) wprintf(L"FAILURE! Delete bar.job returned hr = %x\n",hr); hr = g_pISchedAgent -> Delete(L"bar\foo.job"); if (SUCCEEDED(hr)) wprintf(L"FAILURE! Delete bar\\foo.job returned hr = %x\n\n",hr);
return S_OK; }
//+----------------------------------------------------------------
//
// function: TestITask();
//
// Arguments: none
//
// returns: HRESULT of S_OK. E_FAIL, if bad handle in
// g_pITask. Typically discarded.
//
// Synopsis: Exercises ITask interface.
// Relies on foo2.job from TestISchedAgent.
//
// History: 11-4-96 camerone created
//
//-------------------------------------------------------------------
HRESULT TestITask() { HRESULT hr = S_OK;
if (g_pITask == 0) { return E_FAIL; }
// wprintf(L"------------------------------------------\n\n");
// wprintf(L"Testing ITask interface\n\n");
//
// Need a second job, local
//
IUnknown *pIU = NULL; ITask *pITask = NULL; IPersistFile *pIPF = NULL, *pIPF2 = NULL;
pIU = NULL; pITask = NULL; pIPF = NULL; pIPF2 = NULL;
hr = g_pISchedAgent -> NewWorkItem(L"foo.job", CLSID_CTask, IID_ITask, &pIU); if (FAILED(hr)) { wprintf(L"Failed to create a second test job"); return hr; }
hr = pIU -> QueryInterface(IID_ITask, (void **) &pITask); if (FAILED(hr)) { wprintf(L"Failed to get ITask on foo.job"); return hr; } hr = pIU -> QueryInterface(IID_IPersistFile, (void **) &pIPF); if (FAILED(hr)) { wprintf(L"Failed to get IPersistFile on foo.job"); return hr; } pIPF -> Save(NULL, FALSE); pIU -> Release(); pIU = NULL;
hr = g_pITask -> QueryInterface(IID_IPersistFile, (void **) &pIPF2); if (FAILED(hr)) { wprintf(L"Failed to get IPersistFile on foo2.job"); return hr; }
//
// SetCreator Method
//
hr = pITask -> SetCreator(L"Arnold Palmer"); if (FAILED(hr)) wprintf(L"FAILURE! SetCreator on Arnold Palmer returned hr = %x\n",hr); if (pIPF -> IsDirty() == S_OK) { // wprintf(L"Persisting changes...\n");
pIPF -> Save(NULL, FALSE); } hr = pITask -> SetCreator(L"gomer"); // wprintf(L"SetCreator on gomer returned hr = %x\n",hr);
if (pIPF -> IsDirty() == S_OK) { // wprintf(L"Persisting changes...\n");
pIPF -> Save(NULL, FALSE); }
//
// GetCreator Method
//
LPWSTR wszName;
hr = pITask -> GetCreator(&wszName); if (FAILED(hr)) wprintf(L"\nFAILURE! GetCreator on foo.job returned %s, hr = %x. Should be gomer.\n",wszName,hr); CoTaskMemFree(wszName); hr = g_pITask -> GetCreator(&wszName); if (FAILED(hr)) wprintf(L"FAILURE! GetCreator on foo2.job returned %s, hr = %x. Should be you.\n\n",wszName,hr); CoTaskMemFree(wszName);
//
// SetComment method
//
hr = g_pITask -> SetComment(L"This is a comment"); if (FAILED(hr)) wprintf(L"FAILURE! SetComment returned hr = %x\n",hr); if (pIPF2 -> IsDirty() == S_OK) { // wprintf(L"Persisting changes...\n");
pIPF2 -> Save(NULL,FALSE); }
//
// GetComment Method
//
hr = g_pITask -> GetComment(&wszName); if (FAILED(hr)) wprintf(L"\nFAILURE! GetComment returned %s, hr = %x\n\n",wszName,hr); CoTaskMemFree(wszName);
//
// SetApplicationName method
//
hr = g_pITask -> SetApplicationName(L"cmd.exe"); if (FAILED(hr)) wprintf(L"FAILURE! SetApplicationName to calc.exe returned hr = %x\n",hr); if (pIPF2 -> IsDirty() == S_OK) { // wprintf(L"Persisting changes...\n");
pIPF2 -> Save(NULL,FALSE); }
//
// GetApplicationName method
//
hr = g_pITask -> GetApplicationName(&wszName); if (FAILED(hr)) wprintf(L"\nFAILURE! GetApplicationName returned %s, hr = %x\n\n",wszName,hr); CoTaskMemFree(wszName);
#ifndef _CHICAGO_
// Real OS's support user accounts and credentials
//
// SetAccountInformation method
//
hr = g_pITask -> SetAccountInformation(L"Administrator",L""); if (FAILED(hr)) wprintf(L"FAILURE! SetAccountInformation returned hr = %x\n",hr); if (pIPF2 -> IsDirty() == S_OK) { pIPF2 -> Save(NULL,FALSE); }
//
// GetAccountInformation method
//
hr = g_pITask -> GetAccountInformation(&wszName); if (FAILED(hr)) wprintf(L"\nFAILURE! GetAccountInformation returned hr = %x\n\n",hr); CoTaskMemFree(wszName);
#endif
// Back to universal stuff
//
// GetWorkingDirectory/SetworkingDirectory
//
hr = g_pITask -> GetWorkingDirectory(&wszName); if (FAILED(hr)) wprintf(L"FAILURE! GetWorkingDirectory returned %s, should be NULL, hr = %x\n",wszName,hr); CoTaskMemFree(wszName); hr = g_pITask -> SetWorkingDirectory(L"C:\\"); if (FAILED(hr)) wprintf(L"FAILURE! SetWorking directory to C:\\ returned hr = %x\n",hr); hr = g_pITask -> GetWorkingDirectory(&wszName); if (FAILED(hr)) wprintf(L"FAILURE! GetWorkingDirectory returned %s, hr = %x\n\n",wszName,hr); CoTaskMemFree(wszName) ;
//
// GetPriority/SetPriority
//
DWORD dwPriority;
hr = g_pITask -> GetPriority(&dwPriority); if (FAILED(hr)) wprintf(L"FAILURE! GetPriority returned "); switch(dwPriority) { case REALTIME_PRIORITY_CLASS: // wprintf(L"REALTIME ");
break; case HIGH_PRIORITY_CLASS: // wprintf(L"HIGH ");
break; case NORMAL_PRIORITY_CLASS: // wprintf(L"NORMAL ");
break; case IDLE_PRIORITY_CLASS: // wprintf(L"IDLE ");
break; default: ; // wprintf(L"Unknown result %x ",dwPriority);
} // wprintf(L"hr = %x\n",hr);
hr = g_pITask -> SetPriority(IDLE_PRIORITY_CLASS); if (FAILED(hr)) wprintf(L"FAILURE! SetPriority to IDLE returned hr = %x\n",hr); if (pIPF2 -> IsDirty() == S_OK) { // wprintf(L"Persisting changes...\n");
pIPF2 -> Save(NULL,FALSE); } hr = g_pITask -> GetPriority(&dwPriority); if (FAILED(hr)) wprintf(L"FAILURE! GetPriority returned hr = %x \n",hr); switch(dwPriority) { case REALTIME_PRIORITY_CLASS: // wprintf(L"REALTIME ");
break; case HIGH_PRIORITY_CLASS: // wprintf(L"HIGH ");
break; case NORMAL_PRIORITY_CLASS: // wprintf(L"NORMAL ");
break; case IDLE_PRIORITY_CLASS: // wprintf(L"IDLE ");
break; default: // wprintf(L"Unknown result %x ",dwPriority);
; } // wprintf(L"hr = %x\n",hr);
hr = g_pITask -> SetPriority(NORMAL_PRIORITY_CLASS); if (FAILED(hr)) wprintf(L"FAILURE! SetPriority to NORMAL returned hr = %x\n\n",hr);
//
// GetFlags/SetFlags methods
//
DWORD dwFlags;
hr = g_pITask -> GetFlags(&dwFlags); if (FAILED(hr)) wprintf(L"FAILURE! GetFlags gave %x with hr = %x\n",dwFlags,hr); dwFlags = TASK_FLAG_INTERACTIVE | TASK_FLAG_DELETE_WHEN_DONE | TASK_FLAG_KILL_IF_GOING_ON_BATTERIES; hr = g_pITask -> SetFlags(dwFlags); if (FAILED(hr)) wprintf(L"FAILURE! SetFlags INTERACTIVE, DELETEWHENDONE, KILLIFGOINGONBATTERIES gave hr = %x\n",hr); if (pIPF2 -> IsDirty() == S_OK) { // wprintf(L"Persisting changes...\n");
pIPF2 -> Save(NULL,FALSE); } hr = g_pITask -> GetFlags(&dwFlags); if (FAILED(hr)) { wprintf(L"FAILURE! GetFlags gave hr = %x and flags: \n",hr); if (dwFlags & TASK_FLAG_INTERACTIVE) wprintf(L"INTERACTIVE "); if (dwFlags & TASK_FLAG_DELETE_WHEN_DONE) wprintf(L"DELETEWHENDONE "); if (dwFlags & TASK_FLAG_DISABLED) wprintf(L"DISABLED "); if (dwFlags & TASK_FLAG_HIDDEN) wprintf(L"HIDDEN "); if (dwFlags & TASK_FLAG_START_ONLY_IF_IDLE) wprintf(L"STARTONLYIFIDLE "); if (dwFlags & TASK_FLAG_KILL_ON_IDLE_END) wprintf(L"KILLONIDLEEND "); if (dwFlags & TASK_FLAG_DONT_START_IF_ON_BATTERIES) wprintf(L"DONTSTARTONBATTERIES "); if (dwFlags & TASK_FLAG_KILL_IF_GOING_ON_BATTERIES) wprintf(L"KILLIFGOINGONBATTERIES "); wprintf(L"\n\n"); }
/*
//
// SetIdleWait/GetIdleWait methods
//
WORD wMinutes;
hr = g_pITask -> GetIdleWait(&wMinutes); wprintf(L"GetIdleWait returned %d Minutes, hr = %x\n",wMinutes,hr); hr = g_pITask -> SetIdleWait(12); wprintf(L"SetIdleWait 12 minutes returned hr = %x\n",hr); if (pIPF2 -> IsDirty() == S_OK) { wprintf(L"Persisting changes...\n"); pIPF2 -> Save(NULL,FALSE); } hr = g_pITask -> GetIdleWait(&wMinutes); wprintf(L"GetIdleWait returned %d Minutes, hr = %x\n\n",wMinutes,hr); */ //
// Get/SetMaxRunTime methods
//
DWORD dwMaxRun;
hr = g_pITask -> GetMaxRunTime(&dwMaxRun); if (FAILED(hr)) wprintf(L"FAILURE! GetMaxRunTime returned %d Minutes, hr = %x\n",dwMaxRun/1000/60,hr); dwMaxRun = 12000*60; hr = g_pITask -> SetMaxRunTime(dwMaxRun); if (FAILED(hr)) wprintf(L"FAILURE! SetMaxRunTime for 12 minutes returned hr = %x\n",hr); if (pIPF2 -> IsDirty() == S_OK) { // wprintf(L"Persisting changes...\n");
pIPF2 -> Save(NULL,FALSE); }
hr = g_pITask -> GetMaxRunTime(&dwMaxRun); if (FAILED(hr)) wprintf(L"FAILURE! GetMaxRunTime returned %d Minutes, hr = %x\n\n",dwMaxRun/1000/60,hr);
//
// Get/Set Parameters methods
//
hr = g_pITask -> GetParameters(&wszName); if (FAILED(hr)) wprintf(L"FAILURE! GetParameters returned %s, hr = %x\n",wszName,hr); CoTaskMemFree(wszName); hr = g_pITask -> SetParameters(L"These are my parameters"); if (FAILED(hr)) wprintf(L"FAILURE! SetParameters returned hr = %x\n",hr); if (pIPF2 -> IsDirty() == S_OK) { // wprintf(L"Persisting changes...\n");
pIPF2 -> Save(NULL,FALSE); } hr = g_pITask -> GetParameters(&wszName); if (FAILED(hr)) wprintf(L"FAILURE! GetParameters returned %s, hr = %x\n\n",wszName,hr); CoTaskMemFree(wszName);
//
// GetMostRecentRunTime method (will revisit)
//
SYSTEMTIME tTime;
hr = g_pITask -> GetMostRecentRunTime(&tTime); if (FAILED(hr)) wprintf(L"FAILURE! GetMostRecentRunTime returned hr = %x (should not have run)\n\n",hr);
//
// Run Method
//
hr = g_pITask -> Run(); if (FAILED(hr)) wprintf(L"FAILURE! Foo2 run attempt hr = %x\n",hr);
for (int nLoop = 0; nLoop < 50; nLoop++) { Sleep(100); }
//
// Need to reload off of Disk
//
IUnknown *pIUtemp;
g_pITask -> Release(); g_pITask = NULL; hr = g_pISchedAgent -> Activate(L"foo2.job", IID_ITask, &pIUtemp); if (FAILED(hr)) wprintf(L"FAILURE! Activate foo2.job returned hr = %x\n\n",hr); hr = pIUtemp -> QueryInterface(IID_ITask,(void **) &g_pITask); pIUtemp -> Release(); pIUtemp = NULL;
// Get Status
HRESULT hrStatus; hr = g_pITask -> GetStatus(&hrStatus); if (FAILED(hr)) wprintf(L"FAILURE! Status of job Foo2 is %x, hr = %x\n",hrStatus, hr);
hr = pITask -> Run(); if (SUCCEEDED(hr)) wprintf(L"FAILURE! Foo run attempt (should be error) hr = %x\n\n",hr); hr = g_pITask -> GetStatus(&hrStatus); if (FAILED(hr)) wprintf(L"Status of job Foo is %x, hr = %x\n",hrStatus, hr);
//
// Terminate Method
//
// wprintf(L"Sleeping for 10 seconds to let job catch up.\n");
Sleep(5000); Sleep(5000);
// Reload again
g_pITask -> Release(); g_pITask = NULL; hr = g_pISchedAgent -> Activate(L"foo2.job", IID_ITask, &pIUtemp); if (FAILED(hr)) wprintf(L"FAILURE! Activate foo2.job returned hr = %x\n\n",hr); hr = pIUtemp -> QueryInterface(IID_ITask,(void **) &g_pITask); pIUtemp -> Release(); pIUtemp = NULL;
hr = g_pITask -> Terminate(); if (FAILED(hr) && (hr != SCHED_E_TASK_NOT_RUNNING)) wprintf(L"FAILURE! Foo2 termination returned = %x\n", hr); int k = 0; if (FAILED(hr) && (hr != SCHED_E_TASK_NOT_RUNNING)) { wprintf(L"Foo2 would not die. Trying again.\n"); do { wprintf(L"Sleeping for another second...hr was %x\n",hr); Sleep(1000); // Let job catch up
k++; hr = g_pITask -> Terminate(); } while ((k < 10) && (hr != S_OK)); } if (k == 10) wprintf(L"Tried 10 times and just gave up.\n"); hr = pITask -> Terminate(); if (SUCCEEDED(hr)) wprintf(L"FAILURE! Foo termination (not running) hr = %x\n\n",hr);
//
// GetMostRecentRunTime revisited
//
hr = g_pITask -> GetMostRecentRunTime(&tTime); if (FAILED(hr)) wprintf(L"FAILURE! GetMostRecentRunTime returned hr = %x\n",hr); /* if (hr != SCHED_S_TASK_HAS_NOT_RUN)
{ // Dump Time Structure
wprintf(L"%d/%d/%d %d:%d:%d.%d day %d\n", tTime.wDay, tTime.wMonth, tTime.wYear, tTime.wHour, tTime.wMinute, tTime.wSecond, tTime.wMilliseconds, tTime.wDayOfWeek); } */ //
// GetExitCode method
// The return code is the task's last start error, not an error in
// retrieving the exit code
//
DWORD dwExitCode;
hr = pITask -> GetExitCode(&dwExitCode); hr = g_pITask -> GetExitCode(&dwExitCode);
//
// Clean up...
//
// wprintf(L"Now cleaning up...");
pITask -> Release(); // wprintf(L"pITask ");
pIPF -> Release(); // wprintf(L"pIPF ");
pIPF2 -> Release(); // wprintf(L"pIPF2 ");
hr = g_pISchedAgent -> Delete(L"foo.job"); if (FAILED(hr)) wprintf(L"\nFAILURE! Cleaning up foo.job delete returned %x\n\n",hr);
return S_OK; }
//+-----------------------------------------------------------------
//
// function: TestITaskTrigger();
//
// synopsis: Tests ITaskTrigger, plus associated functionality
// within ITask, as related to ITaskTrigger
//
// Arguments: none
//
// returns: HRESULT, usually S_OK, almost always discarded
//
// history: 11-5-96 camerone created
//
//-------------------------------------------------------------------
HRESULT TestITaskTrigger() { HRESULT hr;
//
// Where we are
//
// wprintf(L"----------------------------------------------------\n");
// wprintf(L"Testing ITaskTrigger and related ITask parts\n\n");
//
// Need to reload off of Disk
//
IUnknown *pIUtemp;
g_pITask -> Release(); g_pITask = NULL; hr = g_pISchedAgent -> Activate(L"foo2.job", IID_ITask, &pIUtemp); if (FAILED(hr)) wprintf(L"FAILURE! Activate foo2.job returned hr = %x\n\n",hr); hr = pIUtemp -> QueryInterface(IID_ITask,(void **) &g_pITask); pIUtemp -> Release(); pIUtemp = NULL;
//
// Allow persistant changes
//
IPersistFile *pIPF = NULL;
hr = g_pITask -> QueryInterface(IID_IPersistFile, (void **) &pIPF); if (FAILED(hr)) { wprintf(L"QueryInterface for IPersistFile failed %x\n",hr); return E_FAIL; }
//
// To test one, we need one.
// CreateTrigger method
//
ITaskTrigger *pITTrig; WORD iTrig, iTrig2, iTrig3;
hr = g_pITask -> CreateTrigger(&iTrig, &g_pITaskTrigger); if (FAILED(hr)) wprintf(L"FAILURE! CreateTrigger returned trigger #%d, hr = %x\n",iTrig,hr);
if (FAILED(hr)) { wprintf(L"Failure to initialize a trigger\n"); return E_FAIL; }
hr = g_pITask -> CreateTrigger(&iTrig2, &pITTrig); if (FAILED(hr)) wprintf(L"FAILURE! CreateTrigger returned trigger #%d, hr = %x\n",iTrig2,hr); pITTrig -> Release(); pITTrig = NULL; hr = g_pITask -> CreateTrigger(&iTrig3, &pITTrig); if (FAILED(hr)) wprintf(L"FAILURE! CreateTrigger returned trigger #%d, hr = %x\n",iTrig3,hr);
if (pIPF -> IsDirty() == S_OK) { // wprintf(L"Persisting changes...\n");
pIPF -> Save(NULL,FALSE); }
//
// Delete the last trigger
//
pITTrig -> Release(); pITTrig = NULL;
hr = g_pITask -> DeleteTrigger(iTrig3); if (FAILED(hr)) wprintf(L"\nFAILURE! DeleteTrigger on %d returned hr = %x\n",iTrig3,hr); if (pIPF -> IsDirty() == S_OK) { // wprintf(L"Persisting changes...\n");
pIPF -> Save(NULL,FALSE); }
//
// GetTriggerString
// we will revisit this one later.
//
LPWSTR pwszTriggerString;
hr = g_pITask -> GetTriggerString(iTrig, &pwszTriggerString); if (FAILED(hr)) wprintf(L"\nFAILURE! GetTrigger string - %s, hr = %x\n\n",pwszTriggerString,hr); CoTaskMemFree(pwszTriggerString);
//
// GetMostRecentRunTimes again.
//
SYSTEMTIME tTime;
hr = g_pITask -> GetMostRecentRunTime(&tTime); if (FAILED(hr)) wprintf(L"FAILURE! GetMostRecentRunTime returned hr = %x\n",hr); /* if (hr != SCHED_S_TASK_HAS_NOT_RUN)
{ // Dump Time Structure
wprintf(L"%d/%d/%d %d:%d:%d.%d day %d\n", tTime.wDay, tTime.wMonth, tTime.wYear, tTime.wHour, tTime.wMinute, tTime.wSecond, tTime.wMilliseconds, tTime.wDayOfWeek); } */ //
// GetTriggerCount Method
//
WORD wTrigCount;
hr = g_pITask -> GetTriggerCount(&wTrigCount); if (FAILED(hr)) wprintf(L"FAILURE! GetTriggerCount shows %d triggers, hr = %x\n\n",wTrigCount,hr);
//
// TaskTrigger GetTriggerString
//
hr = g_pITaskTrigger -> GetTriggerString(&pwszTriggerString); if (FAILED(hr)) wprintf(L"FAILURE! GetTriggerString (TaskTrig) - %s, hr = %x\n\n",pwszTriggerString,hr); CoTaskMemFree(pwszTriggerString);
//
// GetTrigger
//
TASK_TRIGGER Trigger;
Trigger.cbTriggerSize = sizeof(TASK_TRIGGER);
hr = g_pITaskTrigger -> GetTrigger(&Trigger); if (FAILED(hr)) { wprintf(L"FAILURE! GetTrigger returned hr = %x\nDumping structure:\n",hr); wprintf(L"From %d/%d/%d to %d/%d/%d\n",Trigger.wBeginDay, Trigger.wBeginMonth,Trigger.wBeginYear, Trigger.wEndDay,Trigger.wEndMonth,Trigger.wEndYear); wprintf(L"Starting at %d:%d, running for %d or at Interval %d\n", Trigger.wStartHour,Trigger.wStartMinute, Trigger.MinutesDuration,Trigger.MinutesInterval); wprintf(L"Flag mask %x, Trigger Type = %d\n\n",Trigger.rgFlags, Trigger.TriggerType); }
//
// SetTrigger
//
Trigger.wBeginDay = 7; Trigger.wBeginMonth = 10; Trigger.wBeginYear = 1996; Trigger.wEndDay = 21; Trigger.wEndMonth = 1; Trigger.wEndYear = 1997; Trigger.wStartHour = 15; Trigger.wStartMinute = 42; Trigger.MinutesDuration = 2; Trigger.TriggerType = TASK_TIME_TRIGGER_WEEKLY; Trigger.rgFlags = TASK_TRIGGER_FLAG_HAS_END_DATE; Trigger.Type.Weekly.WeeksInterval = 2; Trigger.Type.Weekly.rgfDaysOfTheWeek = TASK_SUNDAY | TASK_FRIDAY;
hr = g_pITaskTrigger -> SetTrigger(&Trigger); if (FAILED(hr)) { wprintf(L"FAILURE! Set trigger returned hr = %x\nSet To: \n",hr); wprintf(L"From %d/%d/%d to %d/%d/%d\n",Trigger.wBeginDay, Trigger.wBeginMonth,Trigger.wBeginYear, Trigger.wEndDay,Trigger.wEndMonth,Trigger.wEndYear); wprintf(L"Starting at %d:%d, running for %d or at Interval %d\n", Trigger.wStartHour,Trigger.wStartMinute, Trigger.MinutesDuration,Trigger.MinutesInterval); wprintf(L"Flag mask %x, Trigger Type = %d\n\n",Trigger.rgFlags, Trigger.TriggerType); } if (pIPF -> IsDirty() == S_OK) { // wprintf(L"Persisting changes...\n");
pIPF -> Save(NULL,FALSE); }
// Get Again
hr = g_pITaskTrigger -> GetTrigger(&Trigger); if (FAILED(hr)) { wprintf(L"FAILURE! GetTrigger returned hr = %x\nDumping structure:\n",hr); wprintf(L"From %d/%d/%d to %d/%d/%d\n",Trigger.wBeginDay, Trigger.wBeginMonth,Trigger.wBeginYear, Trigger.wEndDay,Trigger.wEndMonth,Trigger.wEndYear); wprintf(L"Starting at %d:%d, running for %d or at Interval %d\n", Trigger.wStartHour,Trigger.wStartMinute, Trigger.MinutesDuration,Trigger.MinutesInterval); wprintf(L"Flag mask %x, Trigger Type = %d\n\n",Trigger.rgFlags, Trigger.TriggerType); }
//
// Get Trigger String last time
//
hr = g_pITaskTrigger -> GetTriggerString(&pwszTriggerString); if (FAILED(hr)) wprintf(L"FAILURE! GetTriggerString (TaskTrig) - %s, hr = %x\n\n",pwszTriggerString,hr); CoTaskMemFree(pwszTriggerString);
//
// Some Cleanup
//
g_pITaskTrigger -> Release(); g_pITaskTrigger = NULL;
//
// Get the other trigger
//
hr = g_pITask -> GetTrigger(iTrig2,&g_pITaskTrigger); if (FAILED(hr)) wprintf(L"GetTrigger on #%d returned hr = %x\n\n",iTrig2,hr);
//
// Dump this one
//
hr = g_pITaskTrigger -> GetTrigger(&Trigger); if (FAILED(hr)) { wprintf(L"FAILURE! GetTrigger returned hr = %x\nDumping structure:\n",hr); wprintf(L"From %d/%d/%d to %d/%d/%d\n",Trigger.wBeginDay, Trigger.wBeginMonth,Trigger.wBeginYear, Trigger.wEndDay,Trigger.wEndMonth,Trigger.wEndYear); wprintf(L"Starting at %d:%d, running for %d or at Interval %d\n", Trigger.wStartHour,Trigger.wStartMinute, Trigger.MinutesDuration,Trigger.MinutesInterval); wprintf(L"Flag mask %x, Trigger Type = %d\n\n",Trigger.rgFlags, Trigger.TriggerType); }
//
// Get Trigger String last time
//
hr = g_pITaskTrigger -> GetTriggerString(&pwszTriggerString); if (FAILED(hr)) wprintf(L"FAILURE! GetTriggerString (TaskTrig) - %s, hr = %x\n\n",pwszTriggerString,hr); CoTaskMemFree(pwszTriggerString);
// More cleanup
g_pITaskTrigger -> Release(); g_pITaskTrigger = NULL;
pIPF -> Release(); pIPF = NULL;
return S_OK; }
//+-------------------------------------------------------------------
//
// function: TestIEnum
//
// Synopsis: Tests IEnumTasks methods
//
// Arguments: None
//
// returns: S_OK, possibly others. Basically, discarded.
//
// history: 11-5-96 camerone created
//
//---------------------------------------------------------------------
HRESULT TestIEnum() { HRESULT hr;
//
// Where we are
//
// wprintf(L"------------------------------------------------------\n");
// wprintf(L"Testing IEnumTasks\n");
//
// Get the pointer to the interface
//
hr = g_pISchedAgent -> Enum(&g_pIEnumTasks); if (FAILED(hr)) wprintf(L"FAILURE! ISA Enum returned hr = %x\n\n",hr);
//
// Clean up the folder
//
LPWSTR *rgpwszNames; ULONG celt, celtGot;
celt = 10; hr = g_pIEnumTasks -> Next(celt, &rgpwszNames, &celtGot); if (FAILED(hr)) wprintf(L"FAILURE - Next returned %d results, hr = %x\n",celtGot, hr); for (ULONG i = 0; i < celtGot; i++) { // wprintf(L"%s\n",rgpwszNames[i]);
g_pISchedAgent -> Delete(rgpwszNames[i]); CoTaskMemFree(rgpwszNames[i]); } CoTaskMemFree(rgpwszNames); return S_OK; }
//+----------------------------------------------------------------------
//
// function: TestGRT()
//
// synopsis: Tests GetRunTimes
//
// Arguments: None
//
// Returns: S_OK. Throw it away!
//
// history: 11-15-96 camerone created
//
// Notes: Requires the global pointers to be init'd. Should
// be the last thing called, too, since we need that empty
// tasks folder.
//
//------------------------------------------------------------------------
HRESULT TestGRT() { HRESULT hr = S_OK; IUnknown *pIU = NULL; ITask *pITask = NULL; IPersistFile *pIPF = NULL; ITaskTrigger *pITT1 = NULL, *pITT2 = NULL, *pITT3 = NULL; WORD wTrig1, wTrig2, wTrig3;
// wprintf(L"-----------------------------------------------\n");
// wprintf(L"TestGRT!\n\n");
hr = g_pISchedAgent -> NewWorkItem(L"bar.job", CLSID_CTask, IID_ITask, &pIU); if (FAILED(hr)) { wprintf(L"Failed to allocate New Task bar.job\n"); return E_FAIL; } // wprintf(L"New Task (good - bar.job) returned hr = %x\n\n",hr);
hr = pIU -> QueryInterface(IID_ITask, (void **) &pITask); if (FAILED(hr)) { wprintf(L"QI for ITask failed %x\n",hr); return E_FAIL; } pIU -> Release(); pIU = NULL;
hr = pITask -> QueryInterface(IID_IPersistFile, (void **) &pIPF); if (FAILED(hr)) { wprintf(L"QueryInterface for IPersistFile failed %x\n",hr); return E_FAIL; }
//
// Set up legitimate task parameters.
//
// wprintf(L"Setting Application name to calc.exe\n");
hr = pITask -> SetApplicationName(L"calc.exe"); if (FAILED(hr)) { wprintf(L"SetApplicationName failed %x\n",hr); return E_FAIL; }
// wprintf(L"Setting Account Information security\n");
#ifndef _CHICAGO_
hr = pITask -> SetAccountInformation(L"Administrator",L""); if (FAILED(hr)) { wprintf(L"Failed to set account info %x\n",hr); return E_FAIL; } #endif
DWORD dwFlags = 0;
hr = pITask -> SetFlags(dwFlags);
//
// Great. We now have empty task "foo.job"
// The plan is as follows:
// 1. Create 3 triggers of the following types:
// a. One at Logon
// b. Two set to run Once, in the future
// 2. Call GetRunTimes the following ways:
// a. Asking for 1 run time, in the interval w/trigs
// b. Asking for 2 run times, in the interval w/trigs
// 3. Verify S_OK returned each time
// 4. Call asking for 2 runtimes, when only one possible.
// 5. Verify S_FALSE and pCount == 1 returned
// 6. Call for one trigger, outside of the interval w/trigs
// 7. Verify that SCHED_S_EVENT_TRIGGER returned
// 8. Delete the "LOGON" Trigger
// 9. Call for one trigger, outside possible run interval.
// 10. Verify S_FALSE, pCount == 0 returned.
// 11. Disable task
// 12. Call for one trigger, in the good interval.
// 13. Verify return of SCHED_S_TASK_DISABLED
// 14. Enable Task
// 15. Delete remaining two triggers
// 16. Call for a single trigger, any time.
// 17. Verify return of SCHED_S_NO_VALID_TRIGGERS
// 18. Delete task.
// Create 3 triggers
hr = pITask -> CreateTrigger(&wTrig1, &pITT1); if (hr != S_OK) { wprintf(L"Failed to create first trigger\n"); return E_FAIL; }
hr = pITask -> CreateTrigger(&wTrig2, &pITT2); if (hr != S_OK) { wprintf(L"Failed to create second trigger\n"); return E_FAIL; }
hr = pITask -> CreateTrigger(&wTrig3, &pITT3); if (hr != S_OK) { wprintf(L"Failed to create third trigger\n"); return E_FAIL; }
if (pIPF -> IsDirty() == S_OK) { wprintf(L"Persisting changes...\n"); pIPF -> Save(NULL,FALSE); }
// Setup the three triggers
TASK_TRIGGER TT1, TT2, TT3;
TT1.cbTriggerSize = sizeof(TASK_TRIGGER); TT2.cbTriggerSize = sizeof(TASK_TRIGGER); TT3.cbTriggerSize = sizeof(TASK_TRIGGER);
TT1.Reserved1 = 0; TT1.Reserved2 = 0; TT1.wRandomMinutesInterval = 0; TT1.wBeginYear = 1997; TT1.wBeginMonth = 1; TT1.wBeginDay = 1; TT1.wStartHour = 10; TT1.wStartMinute = 0; TT1.MinutesDuration = 10; TT1.rgFlags = TASK_TRIGGER_FLAG_KILL_AT_DURATION_END; TT1.TriggerType = TASK_TIME_TRIGGER_ONCE; TT1.wEndYear = 0; TT1.wEndMonth = 0; TT1.wEndDay = 0; TT1.MinutesInterval = 0; TT1.Type.Daily.DaysInterval = 1;
TT2.Reserved1 = 0; TT2.Reserved2 = 0; TT2.wRandomMinutesInterval = 0; TT2.wBeginYear = 1997; TT2.wBeginMonth = 1; TT2.wBeginDay = 1; TT2.wStartHour = 11; TT2.wStartMinute = 0; TT2.MinutesDuration = 10; TT2.rgFlags = TASK_TRIGGER_FLAG_KILL_AT_DURATION_END; TT2.TriggerType = TASK_TIME_TRIGGER_ONCE; TT2.wEndYear = 0; TT2.wEndMonth = 0; TT2.wEndDay = 0; TT2.MinutesInterval = 0; TT2.Type.Daily.DaysInterval = 1;
TT3.Reserved1 = 0; TT3.Reserved2 = 0; TT3.wRandomMinutesInterval = 0; TT3.wBeginYear = 1997; TT3.wBeginMonth = 1; TT3.wBeginDay = 1; TT3.wStartHour = 11; TT3.wStartMinute = 0; TT3.MinutesDuration = 10; TT3.rgFlags = TASK_TRIGGER_FLAG_KILL_AT_DURATION_END; TT3.TriggerType = TASK_EVENT_TRIGGER_AT_LOGON; TT3.wEndYear = 0; TT3.wEndMonth = 0; TT3.wEndDay = 0; TT3.MinutesInterval = 0; TT3.Type.Daily.DaysInterval = 1;
hr = pITT1 -> SetTrigger(&TT1); if (hr != S_OK) { wprintf(L"Failed to set trigger 1 hr = %x\n",hr); return E_FAIL; } hr = pITT2 -> SetTrigger(&TT2); if (hr != S_OK) { wprintf(L"Failed to set trigger 2 hr = %x\n",hr); return E_FAIL; } hr = pITT3 -> SetTrigger(&TT3); if (hr != S_OK) { wprintf(L"Failed to set trigger 3 hr = %x\n",hr); return E_FAIL; }
// Persist.
if (pIPF -> IsDirty() == S_OK) { wprintf(L"Persisting changes...\n"); pIPF -> Save(NULL,FALSE); }
// Call GetRunTimes, asking for one and two trigs in interval
SYSTEMTIME tStart, tEnd; WORD wTrigCount; SYSTEMTIME *rgstTaskTimes;
tStart.wDay = 1; tStart.wMonth = 1; tStart.wYear = 1997; tStart.wHour = 9; tStart.wMinute = 0; tStart.wDayOfWeek = 0; tStart.wSecond = 0; tStart.wMilliseconds = 0; tEnd.wDay = 1; tEnd.wMonth = 1; tEnd.wYear = 1997; tEnd.wHour = 12; tEnd.wMinute = 0; tEnd.wDayOfWeek = 0; tEnd.wSecond = 0; tEnd.wMilliseconds = 0;
wTrigCount = 1;
hr = pITask -> GetRunTimes(&tStart, &tEnd, &wTrigCount, &rgstTaskTimes); wprintf(L"GetRunTimes(1) returned %x, should be S_OK. #Trig=%d\n",hr,wTrigCount); CoTaskMemFree(rgstTaskTimes); wTrigCount = 2; hr = pITask -> GetRunTimes(&tStart, &tEnd, &wTrigCount, &rgstTaskTimes); wprintf(L"GetRunTimes(2) returned %x, should be S_OK. #Trig=%d\n",hr,wTrigCount); CoTaskMemFree(rgstTaskTimes);
tStart.wHour = 10; tStart.wMinute = 30;
// Ask for two, where there is only one.
hr = pITask -> GetRunTimes(&tStart, &tEnd, &wTrigCount, &rgstTaskTimes); wprintf(L"GetRunTimes ask two, get one returned %x, should be S_FALSE. #Trig=%d\n",hr,wTrigCount); CoTaskMemFree(rgstTaskTimes);
// Call for two, outside of trigger area, get EVENT
wTrigCount = 2; tStart.wHour = 11; hr = pITask -> GetRunTimes(&tStart, &tEnd, &wTrigCount, &rgstTaskTimes); wprintf(L"GetRunTimes ask outside returned %x, should be SCHED_S_EVENT_TRIGGER #Trig=%d\n",hr,wTrigCount); CoTaskMemFree(rgstTaskTimes);
// Delete trigger 3, remake the call.
pITT3 -> Release(); pITT3 = NULL;
wprintf(L"Now deleting the event trigger\n");
hr = pITask -> DeleteTrigger(wTrig3); if (hr != S_OK) { wprintf(L"Deleting trigger 3 failed\n"); return E_FAIL; }
WORD wCount; hr = pITask -> GetTriggerCount(&wCount); if (hr != S_OK) { wprintf(L"GetTriggerCount failed\n"); return(E_FAIL); } wprintf(L"There are now %d triggers\n",wCount);
wTrigCount = 2; hr = pITask -> GetRunTimes(&tStart, &tEnd, &wTrigCount, &rgstTaskTimes); wprintf(L"GetRunTimes ask outside returned %x, should be S_FALSE #Trig=%d\n",hr,wTrigCount); CoTaskMemFree(rgstTaskTimes);
// Disable task
dwFlags = TASK_FLAG_DISABLED;
hr = pITask -> SetFlags(dwFlags); if (hr != S_OK) { wprintf(L"Couldn't set disabled flag\n"); return E_FAIL; }
tStart.wHour = 9; wTrigCount = 2; hr = pITask -> GetRunTimes(&tStart, &tEnd, &wTrigCount, &rgstTaskTimes); wprintf(L"GetRunTimes disabled (2) returned %x, should be SCHED_S_TASK_DISABLED #Trig=%d\n",hr,wTrigCount); CoTaskMemFree(rgstTaskTimes);
// Enable, remove other trigs
dwFlags ^= TASK_FLAG_DISABLED;
hr = pITask -> SetFlags(dwFlags); if (hr != S_OK) { wprintf(L"Couldn't set disabled flag\n"); return E_FAIL; }
pITT1 -> Release(); pITT1 = NULL; pITT2 -> Release(); pITT2 = NULL;
hr = pITask -> DeleteTrigger(wTrig2); if (hr != S_OK) { wprintf(L"Deleting trigger 2 failed\n"); return E_FAIL; }
hr = pITask -> DeleteTrigger(wTrig1); if (hr != S_OK) { wprintf(L"Deleting trigger 1 failed\n"); return E_FAIL; }
// Persist.
if (pIPF -> IsDirty() == S_OK) { wprintf(L"Persisting changes...\n"); pIPF -> Save(NULL,FALSE); }
// Now call for SCHED_S_NO_VALID_TRIGGERS
wTrigCount = 2; hr = pITask -> GetRunTimes(&tStart, &tEnd, &wTrigCount, &rgstTaskTimes); wprintf(L"GetRunTimes (2) no trigs returned %x, should be SCHED_S_TASK_NO_VALID_TRIGGERS #Trig=%d\n",hr,wTrigCount); CoTaskMemFree(rgstTaskTimes);
// Cleanup
pITask -> Release(); pITask = NULL; pIPF -> Release(); pIPF = NULL;
// Delete job
g_pISchedAgent -> Delete(L"bar.job"); return S_OK; }
|