2010-11-30 7 views
0

J'ai créé un planificateur en C++ J'ai défini tous les paramètres et la tâche est configurée pour s'exécuter uniquement lorsque l'utilisateur est connecté avec le nom d'utilisateur fourni (effectué en définissant le TASK_FLAG_RUN_ONLY_IF_LOGGED_ON drapeau).Impossible de démarrer le planificateur de tâches créé en C++

Lorsque je tente d'exécuter la tâche que je reçois un statut « Impossible de démarrer ». Supposons maintenant que je modifie manuellement une propriété dans la propriété de la tâche et que vous cliquez sur OK, la tâche s'exécute correctement.

Note: La modification manuelle spécifiée peut être quelque chose, comme un simple ajout d'espace à la fin du nom excecutable ou le nom d'utilisateur. Quel peut être le problème?

Ci-dessous le code que je utilise:

#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

Avez-vous fait aucun débogage du tout? Il semble que vous jetez beaucoup de code sur nous pour déboguer pour vous. Vous devriez commencer le processus de débogage vous-même. Débogage. – abelenky

+3

Je serais prêt à déboguer votre mur de code pour 500 $ par 10 minutes. –

+0

Je suis désolé pour le code long. Mais je pensais que le code est nécessaire. Le code fonctionne bien. Je pense qu'il me manque certaines propriétés pour le planificateur. Si quelqu'un a été confronté à ce problème, veuillez le conseiller. – sid

Répondre

0

Je pense que vous devez tester toutes les valeurs de retour, qui pourrait être révélateur. Je suis sur la plupart du temps suspect:

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 J'ai eu l'impression que vous avez besoin d'appeler SetFlags d'abord, puis SetAccountInformation.

+0

Merci pour la réponse Denny. Lorsque j'essaie de sauvegarder le déclencheur en appelant la méthode pIPersistFile-> Save (NULL, TRUE), une erreur est générée. L'erreur est: incapable d'établir du existance planificateur de tâches spécifié de compte. Comment résoudre ce problème? – sid

+0

Je ne vois pas pIPersistFile dans votre code. – DennyRolling

0

J'ai eu le même problème sur XP: le statut « Impossible de démarrer » et tout ok après édition manuelle. Solution:

  • Aller à Avancé -> Afficher le journal. Et voyez la raison de l'échec.
  • Dans mon cas, il y avait "La tentative de récupération des informations de compte pour la tâche spécifiée a échoué". Donc, j'ai juste besoin d'obtenir le nom d'utilisateur via GetUserName et le définir via SetAccountInformation. Notez l'ordre de SetAccountInformation et SetFlags n'a pas d'importance.
  • Jetez un oeil here pour d'autres raisons.

Peut-être cela aidera quelqu'un un jour.

Questions connexes