380 lines
8.4 KiB
C++
380 lines
8.4 KiB
C++
|
#include "stdafx.h"
|
|||
|
#include "MyTaskSchedule.h"
|
|||
|
|
|||
|
|
|||
|
void ShowError(char *lpszText, DWORD dwErrCode)
|
|||
|
{
|
|||
|
char szErr[MAX_PATH] = {0};
|
|||
|
::wsprintf(szErr, "%s Error!\nError Code Is:0x%08x\n", lpszText, dwErrCode);
|
|||
|
::MessageBox(NULL, szErr, "ERROR", MB_OK | MB_ICONERROR);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
CMyTaskSchedule::CMyTaskSchedule(void)
|
|||
|
{
|
|||
|
m_lpITS = NULL;
|
|||
|
m_lpRootFolder = NULL;
|
|||
|
// <20><>ʼ<EFBFBD><CABC>COM
|
|||
|
HRESULT hr = ::CoInitialize(NULL);
|
|||
|
if(FAILED(hr))
|
|||
|
{
|
|||
|
ShowError("CoInitialize", hr);
|
|||
|
}
|
|||
|
// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Task Service<63><65>ʵ<EFBFBD><CAB5>
|
|||
|
hr = ::CoCreateInstance(CLSID_TaskScheduler,
|
|||
|
NULL,
|
|||
|
CLSCTX_INPROC_SERVER,
|
|||
|
IID_ITaskService,
|
|||
|
(LPVOID *)(&m_lpITS));
|
|||
|
if(FAILED(hr))
|
|||
|
{
|
|||
|
ShowError("CoCreateInstance", hr);
|
|||
|
}
|
|||
|
// <20><><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Task Service<63><65>
|
|||
|
hr = m_lpITS->Connect(_variant_t(), _variant_t(), _variant_t(), _variant_t());
|
|||
|
if(FAILED(hr))
|
|||
|
{
|
|||
|
ShowError("ITaskService::Connect", hr);
|
|||
|
}
|
|||
|
// <20><>ȡRoot Task Folder<65><72>ָ<EFBFBD>룬<EFBFBD><EBA3AC><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
hr = m_lpITS->GetFolder(_bstr_t("\\"), &m_lpRootFolder);
|
|||
|
if(FAILED(hr))
|
|||
|
{
|
|||
|
ShowError("ITaskService::GetFolder", hr);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
CMyTaskSchedule::~CMyTaskSchedule(void)
|
|||
|
{
|
|||
|
if(m_lpITS)
|
|||
|
{
|
|||
|
m_lpITS->Release();
|
|||
|
}
|
|||
|
if(m_lpRootFolder)
|
|||
|
{
|
|||
|
m_lpRootFolder->Release();
|
|||
|
}
|
|||
|
// ж<><D0B6>COM
|
|||
|
::CoUninitialize();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
BOOL CMyTaskSchedule::Delete(char *lpszTaskName)
|
|||
|
{
|
|||
|
if(NULL == m_lpRootFolder)
|
|||
|
{
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
CComVariant variantTaskName(NULL);
|
|||
|
variantTaskName = lpszTaskName;
|
|||
|
HRESULT hr = m_lpRootFolder->DeleteTask(variantTaskName.bstrVal, 0);
|
|||
|
if(FAILED(hr))
|
|||
|
{
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
BOOL CMyTaskSchedule::DeleteFolder(char *lpszFolderName)
|
|||
|
{
|
|||
|
if(NULL == m_lpRootFolder)
|
|||
|
{
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
CComVariant variantFolderName(NULL);
|
|||
|
variantFolderName = lpszFolderName;
|
|||
|
HRESULT hr = m_lpRootFolder->DeleteFolder(variantFolderName.bstrVal, 0);
|
|||
|
if(FAILED(hr))
|
|||
|
{
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
BOOL CMyTaskSchedule::NewTask(char *lpszTaskName, char *lpszProgramPath, char *lpszParameters, char *lpszAuthor)
|
|||
|
{
|
|||
|
if(NULL == m_lpRootFolder)
|
|||
|
{
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD>ļƻ<C4BC><C6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><C9BE>
|
|||
|
Delete(lpszTaskName);
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
ITaskDefinition *pTaskDefinition = NULL;
|
|||
|
HRESULT hr = m_lpITS->NewTask(0, &pTaskDefinition);
|
|||
|
if(FAILED(hr))
|
|||
|
{
|
|||
|
ShowError("ITaskService::NewTask", hr);
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD>Ϣ */
|
|||
|
IRegistrationInfo *pRegInfo = NULL;
|
|||
|
CComVariant variantAuthor(NULL);
|
|||
|
variantAuthor = lpszAuthor;
|
|||
|
hr = pTaskDefinition->get_RegistrationInfo(&pRegInfo);
|
|||
|
if(FAILED(hr))
|
|||
|
{
|
|||
|
ShowError("pTaskDefinition::get_RegistrationInfo", hr);
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
|||
|
hr = pRegInfo->put_Author(variantAuthor.bstrVal);
|
|||
|
pRegInfo->Release();
|
|||
|
|
|||
|
/* <20><><EFBFBD>õ<EFBFBD>¼<EFBFBD><C2BC><EFBFBD>ͺ<EFBFBD><CDBA><EFBFBD><EFBFBD><EFBFBD>Ȩ<EFBFBD><C8A8> */
|
|||
|
IPrincipal *pPrincipal = NULL;
|
|||
|
hr = pTaskDefinition->get_Principal(&pPrincipal);
|
|||
|
if(FAILED(hr))
|
|||
|
{
|
|||
|
ShowError("pTaskDefinition::get_Principal", hr);
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
// <20><><EFBFBD>õ<EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>
|
|||
|
hr = pPrincipal->put_LogonType(TASK_LOGON_INTERACTIVE_TOKEN);
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȩ<EFBFBD><C8A8>
|
|||
|
// <20><><EFBFBD><EFBFBD>Ȩ<EFBFBD><C8A8>
|
|||
|
hr = pPrincipal->put_RunLevel(TASK_RUNLEVEL_HIGHEST);
|
|||
|
pPrincipal->Release();
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ */
|
|||
|
ITaskSettings *pSettting = NULL;
|
|||
|
hr = pTaskDefinition->get_Settings(&pSettting);
|
|||
|
if(FAILED(hr))
|
|||
|
{
|
|||
|
ShowError("pTaskDefinition::get_Settings", hr);
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
|||
|
hr = pSettting->put_StopIfGoingOnBatteries(VARIANT_FALSE);
|
|||
|
hr = pSettting->put_DisallowStartIfOnBatteries(VARIANT_FALSE);
|
|||
|
hr = pSettting->put_AllowDemandStart(VARIANT_TRUE);
|
|||
|
hr = pSettting->put_StartWhenAvailable(VARIANT_FALSE);
|
|||
|
hr = pSettting->put_MultipleInstances(TASK_INSTANCES_PARALLEL);
|
|||
|
pSettting->Release();
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD>ִ<EFBFBD>ж<EFBFBD><D0B6><EFBFBD> */
|
|||
|
IActionCollection *pActionCollect = NULL;
|
|||
|
hr = pTaskDefinition->get_Actions(&pActionCollect);
|
|||
|
if(FAILED(hr))
|
|||
|
{
|
|||
|
ShowError("pTaskDefinition::get_Actions", hr);
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
IAction *pAction = NULL;
|
|||
|
// <20><><EFBFBD><EFBFBD>ִ<EFBFBD>в<EFBFBD><D0B2><EFBFBD>
|
|||
|
hr = pActionCollect->Create(TASK_ACTION_EXEC, &pAction);
|
|||
|
pActionCollect->Release();
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD>ִ<EFBFBD>г<EFBFBD><D0B3><EFBFBD>·<EFBFBD><C2B7><EFBFBD>Ͳ<EFBFBD><CDB2><EFBFBD> */
|
|||
|
CComVariant variantProgramPath(NULL);
|
|||
|
CComVariant variantParameters(NULL);
|
|||
|
IExecAction *pExecAction = NULL;
|
|||
|
hr = pAction->QueryInterface(IID_IExecAction, (PVOID *)(&pExecAction));
|
|||
|
if(FAILED(hr))
|
|||
|
{
|
|||
|
pAction->Release();
|
|||
|
ShowError("IAction::QueryInterface", hr);
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
pAction->Release();
|
|||
|
// <20><><EFBFBD>ó<EFBFBD><C3B3><EFBFBD>·<EFBFBD><C2B7><EFBFBD>Ͳ<EFBFBD><CDB2><EFBFBD>
|
|||
|
variantProgramPath = lpszProgramPath;
|
|||
|
variantParameters = lpszParameters;
|
|||
|
pExecAction->put_Path(variantProgramPath.bstrVal);
|
|||
|
pExecAction->put_Arguments(variantParameters.bstrVal);
|
|||
|
pExecAction->Release();
|
|||
|
|
|||
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD>û<EFBFBD><C3BB><EFBFBD>½<EFBFBD><C2BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|||
|
ITriggerCollection *pTriggers = NULL;
|
|||
|
hr = pTaskDefinition->get_Triggers(&pTriggers);
|
|||
|
if (FAILED(hr))
|
|||
|
{
|
|||
|
ShowError("pTaskDefinition::get_Triggers", hr);
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
ITrigger *pTrigger = NULL;
|
|||
|
hr = pTriggers->Create(TASK_TRIGGER_LOGON, &pTrigger);
|
|||
|
if (FAILED(hr))
|
|||
|
{
|
|||
|
ShowError("ITriggerCollection::Create", hr);
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
/* ע<><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƻ<EFBFBD> */
|
|||
|
IRegisteredTask *pRegisteredTask = NULL;
|
|||
|
CComVariant variantTaskName(NULL);
|
|||
|
variantTaskName = lpszTaskName;
|
|||
|
hr = m_lpRootFolder->RegisterTaskDefinition(variantTaskName.bstrVal,
|
|||
|
pTaskDefinition,
|
|||
|
TASK_CREATE_OR_UPDATE,
|
|||
|
_variant_t(),
|
|||
|
_variant_t(),
|
|||
|
TASK_LOGON_INTERACTIVE_TOKEN,
|
|||
|
_variant_t(""),
|
|||
|
&pRegisteredTask);
|
|||
|
if(FAILED(hr))
|
|||
|
{
|
|||
|
pTaskDefinition->Release();
|
|||
|
ShowError("ITaskFolder::RegisterTaskDefinition", hr);
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
pTaskDefinition->Release();
|
|||
|
pRegisteredTask->Release();
|
|||
|
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
BOOL CMyTaskSchedule::IsExist(char *lpszTaskName)
|
|||
|
{
|
|||
|
if(NULL == m_lpRootFolder)
|
|||
|
{
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
HRESULT hr = S_OK;
|
|||
|
CComVariant variantTaskName(NULL);
|
|||
|
CComVariant variantEnable(NULL);
|
|||
|
variantTaskName = lpszTaskName; // <20><><EFBFBD><EFBFBD><EFBFBD>ƻ<EFBFBD><C6BB><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
IRegisteredTask *pRegisteredTask = NULL;
|
|||
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ƻ<EFBFBD>
|
|||
|
hr = m_lpRootFolder->GetTask(variantTaskName.bstrVal, &pRegisteredTask);
|
|||
|
if(FAILED(hr) || (NULL == pRegisteredTask))
|
|||
|
{
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
pRegisteredTask->Release();
|
|||
|
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
BOOL CMyTaskSchedule::IsTaskValid(char *lpszTaskName)
|
|||
|
{
|
|||
|
if(NULL == m_lpRootFolder)
|
|||
|
{
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
HRESULT hr = S_OK;
|
|||
|
CComVariant variantTaskName(NULL);
|
|||
|
CComVariant variantEnable(NULL);
|
|||
|
variantTaskName = lpszTaskName; // <20><><EFBFBD><EFBFBD><EFBFBD>ƻ<EFBFBD><C6BB><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
IRegisteredTask *pRegisteredTask = NULL;
|
|||
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ƻ<EFBFBD>
|
|||
|
hr = m_lpRootFolder->GetTask(variantTaskName.bstrVal, &pRegisteredTask);
|
|||
|
if(FAILED(hr) || (NULL == pRegisteredTask))
|
|||
|
{
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>״̬
|
|||
|
TASK_STATE taskState;
|
|||
|
hr = pRegisteredTask->get_State(&taskState);
|
|||
|
if(FAILED(hr))
|
|||
|
{
|
|||
|
pRegisteredTask->Release();
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
pRegisteredTask->Release();
|
|||
|
// <20><>Ч
|
|||
|
if(TASK_STATE_DISABLED == taskState)
|
|||
|
{
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
BOOL CMyTaskSchedule::Run(char *lpszTaskName, char *lpszParam)
|
|||
|
{
|
|||
|
if(NULL == m_lpRootFolder)
|
|||
|
{
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
HRESULT hr = S_OK;
|
|||
|
CComVariant variantTaskName(NULL);
|
|||
|
CComVariant variantParameters(NULL);
|
|||
|
variantTaskName = lpszTaskName;
|
|||
|
variantParameters = lpszParam;
|
|||
|
|
|||
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ƻ<EFBFBD>
|
|||
|
IRegisteredTask *pRegisteredTask = NULL;
|
|||
|
hr = m_lpRootFolder->GetTask(variantTaskName.bstrVal, &pRegisteredTask);
|
|||
|
if(FAILED(hr) || (NULL == pRegisteredTask))
|
|||
|
{
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
// <20><><EFBFBD><EFBFBD>
|
|||
|
hr = pRegisteredTask->Run(variantParameters, NULL);
|
|||
|
if(FAILED(hr))
|
|||
|
{
|
|||
|
pRegisteredTask->Release();
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
pRegisteredTask->Release();
|
|||
|
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
BOOL CMyTaskSchedule::IsEnable(char *lpszTaskName)
|
|||
|
{
|
|||
|
if(NULL == m_lpRootFolder)
|
|||
|
{
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
HRESULT hr = S_OK;
|
|||
|
CComVariant variantTaskName(NULL);
|
|||
|
CComVariant variantEnable(NULL);
|
|||
|
variantTaskName = lpszTaskName; // <20><><EFBFBD><EFBFBD><EFBFBD>ƻ<EFBFBD><C6BB><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
IRegisteredTask *pRegisteredTask = NULL;
|
|||
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ƻ<EFBFBD>
|
|||
|
hr = m_lpRootFolder->GetTask(variantTaskName.bstrVal, &pRegisteredTask);
|
|||
|
if(FAILED(hr) || (NULL == pRegisteredTask))
|
|||
|
{
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
// <20><>ȡ<EFBFBD>Ƿ<EFBFBD><C7B7>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
pRegisteredTask->get_Enabled(&variantEnable.boolVal);
|
|||
|
pRegisteredTask->Release();
|
|||
|
if(ATL_VARIANT_FALSE == variantEnable.boolVal)
|
|||
|
{
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
BOOL CMyTaskSchedule::SetEnable(char *lpszTaskName, BOOL bEnable)
|
|||
|
{
|
|||
|
if(NULL == m_lpRootFolder)
|
|||
|
{
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
HRESULT hr = S_OK;
|
|||
|
CComVariant variantTaskName(NULL);
|
|||
|
CComVariant variantEnable(NULL);
|
|||
|
variantTaskName = lpszTaskName; // <20><><EFBFBD><EFBFBD><EFBFBD>ƻ<EFBFBD><C6BB><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
variantEnable = bEnable; // <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
IRegisteredTask *pRegisteredTask = NULL;
|
|||
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ƻ<EFBFBD>
|
|||
|
hr = m_lpRootFolder->GetTask(variantTaskName.bstrVal, &pRegisteredTask);
|
|||
|
if(FAILED(hr) || (NULL == pRegisteredTask))
|
|||
|
{
|
|||
|
return FALSE;
|
|||
|
}
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
pRegisteredTask->put_Enabled(variantEnable.boolVal);
|
|||
|
pRegisteredTask->Release();
|
|||
|
|
|||
|
return TRUE;
|
|||
|
}
|
|||
|
|