AutoRun_Task_Test/src/AutoRun_Task_Test/MyTaskSchedule.cpp

380 lines
8.4 KiB
C++
Raw Normal View History

2021-10-19 00:12:52 +00:00
#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;
}