2012-03-19 30 views
5

Tôi đang cố tạo một chương trình rất đơn giản sẽ chạy Notepad sau hai phút (tất cả đều đơn giản hóa để đưa ra câu hỏi rõ ràng hơn). Tôi đã cố gắng hợp nhất một số của MSDN's examples và ngạc nhiên của tôi tất cả mọi thứ biên soạn thành công, khi chạy chương trình một nhiệm vụ .job được tạo ra trong C:\Windows\Tasks. Tôi không thấy nhiệm vụ mới trong chương trình GUI "Task Scheduler" và tôi giả định điều này là do "Task Scheduler" chỉ hiển thị các tác vụ Task Scheduler 2.0, nhưng tôi không chắc chắn. Vấn đề là nhiệm vụ không được thực hiện. Tôi đang gắn mã, nó dài một chút nhưng cũng được ghi lại.Cố gắng tạo một tác vụ được lập lịch để chạy khi sử dụng C++, Task Scheduler 1.0 trên win7

Ai đó có thể giúp tìm ra điều này không? Nếu một tác vụ gặp lỗi khi chạy nó được ghi ở đâu?

Lưu ý 1: Tôi biết cách tôi tính toán thời gian bắt đầu không phải là lý tưởng (và sẽ cho kết quả bị lỗi vào những thời điểm phút là >57). Như tôi đã nói trước khi mã dưới đây là một phiên bản đơn giản.

Lưu ý 2: Tôi đang chạy nó trên win7 và tôi cho rằng nó tương thích với API của Trình lập lịch tác vụ 1.0. Mã này sẽ chạy trên cả hai máy XP và win7 (và hy vọng sẽ giành chiến thắng 8 trong tương lai)

Lưu ý 3: Đối với bất kỳ ai đủ can đảm để thử nó, nếu bạn gặp lỗi 0x80070050 nó có nghĩa là một nhiệm vụ với tên đó đã tồn tại, xóa tệp .job hoặc thay đổi tên.

#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:

tôi thêm như sau:

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

    pITask->SetFlags(TASK_FLAG_RUN_ONLY_IF_LOGGED_ON); 

và:

/////////////////////////////////////////////////////////////////// 
    // 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; 
    } 

Bây giờ nhiệm vụ là nhận được hiển thị trong lịch trình công việc và đang được thực hiện dưới HỆ THỐNG tài khoản (Notepad.exe không được hiển thị vì tài khoản SYSTEM không tương tác với máy tính để bàn hoặc một cái gì đó). Nếu tôi thay đổi nó thành hr = pITask->SetAccountInformation(L"MyUserName", NULL); thì Notepad sẽ được hiển thị. Đã giải quyết vấn đề :).

Trả lời

3

Set Flags:

pITask->SetFlags(TASK_FLAG_RUN_ONLY_IF_LOGGED_ON); 

Set thông tin tài khoản:

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

Và Bob chú của bạn

Các vấn đề liên quan