2011-03-23 100 views
0

C++で書かれたWindowsサービスでWaitableTimerを使用して、Windows XPマシンをスリープ/スタンバイモードから復帰させようとしていますが、動作させられないようです。私は、サービスで使用しているコードをスタンドアロンアプリにコピー&ペーストしても問題ありません。これをサービス内で動作させるために欠けているステップがありますか?Windowsサービス内のWaitable Timerの使用

私は(UpdateWaitableTimer()の呼び出しが無限にループするスレッド内で起こる)待機可能タイマーを設定するには、次のようにされて使用していますコード:

void UpdateWaitableTimer(job_definition *jobdef) 
{ 
    HANDLE existingHandle; 
    try 
    { 
     if (jobdef->JobType == JOB_TYPE_SCAN) 
     { 
      char szTimerName[MAX_PATH]; 
      sprintf_s(szTimerName, MAX_PATH, "Timer_%I64d", jobdef->JobID); 

      existingHandle = OpenWaitableTimer(TIMER_ALL_ACCESS, TRUE, szTimerName); 


      if (existingHandle != NULL) 
      { 

       // A timer handle already exists for this job, so cancel it 
       CancelWaitableTimer(existingHandle); 
      } 
      else 
      { 

       // No timer handle exists, create one 
       existingHandle = CreateWaitableTimer(NULL, TRUE, szTimerName); 
      } 

      if (jobdef->JobStatus != JOB_STATUS_SCHEDULED) 
      { 

       // This job was cancelled, so close the handle 
       CloseHandle(existingHandle); 
      } 
      else 
      { 

       time_t now = time(NULL); 
       time_t dt = jobdef->JobScheduleTime; 

       while(dt < now) 
       { 
        dt += 86400; 
       } 

       // Get a FILETIME one minute before 
       FILETIME utcFileTime = GetTimestamp(dt - 60); 

       // Convert to LARGE_INTEGER 
       LARGE_INTEGER dueTime; 
       dueTime.HighPart = utcFileTime.dwHighDateTime; 
       dueTime.LowPart = utcFileTime.dwLowDateTime; 

       SYSTEMTIME st; 
       FILETIME *ft = &utcFileTime; 
       FileTimeToSystemTime(ft, &st); 
       LogRelease(false, "Setting Timer for scheduled job: %02d/%02d/%d %02d:%02d:%02d", st.wMonth, st.wDay, st.wYear, st.wHour, st.wMinute, st.wSecond); 


       if(SetWaitableTimer(existingHandle, &dueTime, 0, NULL, NULL, TRUE)) 
       { 
        if(GetLastError() == ERROR_NOT_SUPPORTED) 
        { 
         LogRelease(false, "Resume from sleep/stand-by feature not supported on this operating system."); 
        } 
       } 
       else 
       { 

        LogError(false, "Could not create timer. Error: %d", GetLastError()); 
       } 
      } 
     } 
    } 
    catch(...) 
    { 
     LogError(false, "An exception occured while updating waitable timer for job %I64d", jobdef->JobID); 
    } 

    LogRelease(false, "Finished Updating Waitable Timer [Job:%I64d]", jobdef->JobID); 
} 

答えて

2

それはあなたのコード、サービスの外に動作する場合おそらく大丈夫です。本当に私はそのことを考えることができる唯一の二つのことは、それが異なる動作をする場合がありますがあります「デスクトップとの対話」

  1. 再開ができるようにするサービスが必要な場合がありますサービスマネージャの[ログオン]タブでそのオプションを設定して、サービスを再起動してください。

  2. LOCAL_SYSTEMとして実行されているサービスでは、スリープから再開する権利がない可能性があります。サービスを自分で実行してみるか、サービスの実行に特化したサービスアカウントを作成してください。

既に特定のユーザーとしてサービスを実行している場合は、そのユーザーアカウントのアクセス許可が不十分である可能性があります。

関連する問題