2012-03-19 11 views
5

Próbuję stworzyć bardzo prosty program, który uruchomi Notatnik po dwóch minutach (wszystkie są uproszczone, aby uzyskać bardziej przejrzyste pytanie). Próbowałem połączyć niektóre z MSDN's examples i ku mojemu zdziwieniu wszystko skompilowane pomyślnie, podczas uruchamiania programu zadanie .job jest tworzone w C:\Windows\Tasks. Nie widzę nowego zadania w programie GUI "Task Scheduler" i zakładam, że dzieje się tak dlatego, że "Task Scheduler" pokazuje tylko zadania Task Scheduler 2.0, ale nie jestem pewien. Problem polega na tym, że zadanie nie jest wykonywane. Załączam kod, jest trochę długi, ale dobrze udokumentowany.Próba utworzenia zaplanowanego zadania jednokrotnego uruchomienia przy użyciu C++, Task Scheduler 1.0 na win7

Czy ktoś może pomóc w ustaleniu tego? Jeśli jakieś zadanie otrzymało błąd podczas uruchamiania w miejscu, w którym zostało zarejestrowane?

Uwaga 1: Wiem, że sposób obliczania czasu rozpoczęcia nie jest idealny (i da błędne wyniki w godzinach, w których minuty to >57). Jak już powiedziałem, poniższy kod jest wersją uproszczoną.

Uwaga 2: Używam go na win7 i zakładam, że jest zgodny z API Task Scheduler 1.0. Ten kod powinien działać na komputerach XP i win7 (i, miejmy nadzieję, na wygranej 8 w przyszłości).

Uwaga 3: Dla każdego, kto jest na tyle odważny, aby go wypróbować, jeśli pojawi się błąd 0x80070050, oznacza to, że zadanie o tej nazwie już jest istnieje, usuń plik .job lub zmień jego nazwę.

#include <windows.h> 
#include <initguid.h> 
#include <ole2.h> 
#include <mstask.h> 
#include <msterr.h> 
#include <objidl.h> 
#include <wchar.h> 
#include <stdio.h> 


int main(int argc, char **argv) 
{ 
    HRESULT hr = S_OK; 
    ITaskScheduler *pITS; 


    ///////////////////////////////////////////////////////////////// 
    // Call CoInitialize to initialize the COM library and then 
    // call CoCreateInstance to get the Task Scheduler object. 
    ///////////////////////////////////////////////////////////////// 
    hr = CoInitialize(NULL); 
    if (SUCCEEDED(hr)) 
    { 
    hr = CoCreateInstance(CLSID_CTaskScheduler, 
          NULL, 
          CLSCTX_INPROC_SERVER, 
          IID_ITaskScheduler, 
          (void **) &pITS); 
    if (FAILED(hr)) 
    { 
     CoUninitialize(); 
     return 1; 
    } 
    } 
    else 
    { 
    return 1; 
    } 


    ///////////////////////////////////////////////////////////////// 
    // Call ITaskScheduler::NewWorkItem to create new task. 
    ///////////////////////////////////////////////////////////////// 
    LPCWSTR pwszTaskName; 
    ITask *pITask; 
    IPersistFile *pIPersistFile; 
    pwszTaskName = L"Test Task"; 

    hr = pITS->NewWorkItem(pwszTaskName,   // Name of task 
         CLSID_CTask,   // Class identifier 
         IID_ITask,   // Interface identifier 
         (IUnknown**)&pITask); // Address of task 
                                                  // interface 


    pITS->Release();        // Release object 
    if (FAILED(hr)) 
    { 
    CoUninitialize(); 
    fprintf(stderr, "Failed calling NewWorkItem, error = 0x%x\n",hr); 
    return 1; 
    } 

    ///////////////////////////////////////////////////////////////// 
    //Set Comment, Name, Working dir, Params 
    ///////////////////////////////////////////////////////////////// 
    pITask->SetComment(L"This is a comment"); 
    pITask->SetApplicationName(L"C:\\Windows\\System32\\notepad.exe"); 
    pITask->SetWorkingDirectory(L"C:\\Windows\\System32"); 
    pITask->SetParameters(L""); 

    /////////////////////////////////////////////////////////////////// 
    // Call ITask::CreateTrigger to create new trigger. 
    /////////////////////////////////////////////////////////////////// 

    ITaskTrigger *pITaskTrigger; 
    WORD piNewTrigger; 
    hr = pITask->CreateTrigger(&piNewTrigger, 
          &pITaskTrigger); 
    if (FAILED(hr)) 
    { 
    wprintf(L"Failed calling ITask::CreatTrigger: "); 
    wprintf(L"error = 0x%x\n",hr); 
    pITask->Release(); 
    CoUninitialize(); 
    return 1; 
    } 

////////////////////////////////////////////////////// 
    // Define TASK_TRIGGER structure. Note that wBeginDay, 
    // wBeginMonth, and wBeginYear must be set to a valid 
    // day, month, and year respectively. 
    ////////////////////////////////////////////////////// 

    TASK_TRIGGER pTrigger; 
    ZeroMemory(&pTrigger, sizeof (TASK_TRIGGER)); 

    LPSYSTEMTIME lpSystemTime; 
    GetLocalTime(lpSystemTime); 


    // Add code to set trigger structure? 
    pTrigger.wBeginDay = lpSystemTime->wDay;     // Required 
    pTrigger.wBeginMonth = lpSystemTime->wMonth;    // Required 
    pTrigger.wBeginYear =lpSystemTime->wYear;    // Required 
    pTrigger.cbTriggerSize = sizeof (TASK_TRIGGER); 
    pTrigger.wStartHour = lpSystemTime->wHour; 
    pTrigger.wStartMinute = lpSystemTime->wMinute + 2; 
    pTrigger.TriggerType = TASK_TIME_TRIGGER_DAILY; 
    pTrigger.Type.Daily.DaysInterval = 1; 


    /////////////////////////////////////////////////////////////////// 
    // Call ITaskTrigger::SetTrigger to set trigger criteria. 
    /////////////////////////////////////////////////////////////////// 

    hr = pITaskTrigger->SetTrigger (&pTrigger); 
    if (FAILED(hr)) 
    { 
    wprintf(L"Failed calling ITaskTrigger::SetTrigger: "); 
    wprintf(L"error = 0x%x\n",hr); 
    pITask->Release(); 
    pITaskTrigger->Release(); 
    CoUninitialize(); 
    return 1; 
    } 




    ///////////////////////////////////////////////////////////////// 
    // Call IUnknown::QueryInterface to get a pointer to 
    // IPersistFile and IPersistFile::Save to save 
    // the new task to disk. 
    ///////////////////////////////////////////////////////////////// 

    hr = pITask->QueryInterface(IID_IPersistFile, 
           (void **)&pIPersistFile); 

    pITask->Release(); 
    if (FAILED(hr)) 
    { 
    CoUninitialize(); 
    fprintf(stderr, "Failed calling QueryInterface, error = 0x%x\n",hr); 
    return 1; 
    } 


    hr = pIPersistFile->Save(NULL, 
          TRUE); 
    pIPersistFile->Release(); 
    if (FAILED(hr)) 
    { 
    CoUninitialize(); 
    fprintf(stderr, "Failed calling Save, error = 0x%x\n",hr); 
    return 1; 
    } 


    CoUninitialize(); 
    printf("Created task.\n"); 
    return 0; 
} 

EDIT:

dodałem następujące:

///////////////////////////////////////////////////////////////// 
    //Set Flags 
    ///////////////////////////////////////////////////////////////// 

    pITask->SetFlags(TASK_FLAG_RUN_ONLY_IF_LOGGED_ON); 

i:

/////////////////////////////////////////////////////////////////// 
    // Call ITask::SetAccountInformation to specify the account name 
    // and the account password for Test Task. 
    /////////////////////////////////////////////////////////////////// 
    hr = pITask->SetAccountInformation(L"", 
      NULL); 


    if (FAILED(hr)) 
    { 
    wprintf(L"Failed calling ITask::SetAccountInformation: "); 
    wprintf(L"error = 0x%x\n",hr); 
    pITask->Release(); 
    CoUninitialize(); 
    return 1; 
    } 

Teraz zadaniem jest uzyskiwanie wyświetlane w harmonogramie zadań i jest realizowany w ramach SYSTEMU konto (Notepad.exe nie jest wyświetlany, ponieważ konto SYSTEM nie jest interaktywne z komputerem lub czymś podobnym). Jeśli zmienię go na hr = pITask->SetAccountInformation(L"MyUserName", NULL);, wyświetlony zostanie Notatnik. Problem rozwiązany :).

Odpowiedz

3

zestaw Flagi:

pITask->SetFlags(TASK_FLAG_RUN_ONLY_IF_LOGGED_ON); 

Set informacyjne konto:

hr = pITask->SetAccountInformation(L"Username", 
      NULL); 

I Boba Twój wuj

Powiązane problemy