2010-11-30 16 views
0

C++でスケジューラを作成しましたが、すべてのパラメータを設定していて、ユーザー名でログオンしているときにのみ実行されるようにタスクが設定されています。(TASK_FLAG_RUN_ONLY_IF_LOGGED_ONフラグ)。C++で作成されたタスクスケジューラを起動できませんでした

タスクを実行しようとすると、「開始できませんでした」というステータスが表示されます。ここで、タスクプロパティの任意のプロパティを手動で編集し、[OK]をクリックすると、タスクがうまく動作するとします。

注:指定された手動編集は、excecutable名またはユーザー名の末尾にスペースを追加するだけのものです。何が問題なのでしょうか?以下は

は、私が使用していたコードです:

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

#pragma comment(lib, "Mstask.lib") 
#pragma comment(lib, "ole32.lib") 

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

/////////////////////////////////////////////////////////////////// 
// Call CoInitialize to initialize the COM library and then 
// 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; 
} 

LPCWSTR pwszTaskName; 
ITask *pITask; 
    pwszTaskName = L"TestTask"; 

hr = pITS->NewWorkItem(pwszTaskName, 
    CLSID_CTask, 
    IID_ITask, 
(IUnknown**)&pITask); 

    if (FAILED(hr)) 
{ 
    wprintf(L"Failed calling ITaskScheduler::NewWorkItem: "); 
    wprintf(L"error = 0x%x\n",hr); 
    CoUninitialize(); 
    return 1; 
    } 


    LPCWSTR pwszApplicationName = L"C:\\windows\\notepad.exe"; 

    hr = pITask->SetApplicationName(pwszApplicationName); 

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

    pITask->SetAccountInformation(L"USERNAME", NULL); 
    pITask->SetFlags(TASK_FLAG_RUN_ONLY_IF_LOGGED_ON); 
    pITask->SetWorkingDirectory(L"C:\\windows"); 


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

    pITS->AddWorkItem(pwszTaskName, pITask); 
    pITS->Release(); // Release sceduler 

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

    pITask->Release();  
    CoUninitialize(); 
    _getch(); 
    return 0; 
} 
+1

デバッグは一切行っていませんか?あなたのためにデバッグするためにたくさんのコードをダンプしているようです。自分でデバッグプロセスを開始する必要があります。デバッグ – abelenky

+3

10分ごとに500ドルでコードの壁をデバッグします。 –

+0

長いコードをおかけして申し訳ありません。しかし、私はコードが必要だと思った。コードは正常に動作します。私はスケジューラのいくつかのプロパティが欠けていると思う。誰かがこの問題に直面した場合は、アドバイスをお願いします。 – sid

答えて

0

私はあなたが暴露の可能性がすべての戻り値をテストする必要があると思います。私は約ほとんどは疑わしいです:

pITask->SetAccountInformation(L"USERNAME", NULL); 
pITask->SetFlags(TASK_FLAG_RUN_ONLY_IF_LOGGED_ON); 

Readinig http://msdn.microsoft.com/en-us/library/aa381276(VS.85).aspx私はあなたが最初でsetFlagsを呼び出した後、SetAccountInformationする必要がある印象を受けました。

+0

返事Dennyに感謝します。 pIPersistFile-> Save(NULL、TRUE)メソッドを呼び出してトリガーを保存しようとすると、エラーがスローされます。 エラーは次のとおりです。 アカウント指定のタスクスケジューラが存在しません。 どうすれば解決できますか? – sid

+0

コードにpIPersistFileが表示されません。 – DennyRolling

0

私はXPで同じ問題を抱えていました。ステータスは「開始できませんでした」と手動編集後はすべてokです。 解決策:

  • 詳細を表示 - >ログを表示します。そして失敗の理由を見てください。
  • 私の場合、「指定されたタスクのアカウント情報を取得しようとしましたが失敗しました。だから私はちょうどGetUserName経由でユーザー名を取得し、SetAccountInformation経由で設定する必要がありました。 SetAccountInformationSetFlagsの順番は関係ありません。
  • その他の理由でhereを見てください。

いつか誰かを助けることがありますか。

関連する問題