2011-03-23 59 views
0

我正在嘗試在用C++編寫的Windows服務中使用WaitableTimer將Windows XP機器帶出睡眠/待機模式,但似乎無法使其工作。我將我在服務中使用的代碼複製/粘貼到獨立應用程序中,並且工作正常。我錯過了一個步驟來讓它在服務中工作嗎?從Windows服務中使用等待定時器

我使用的成立可等待定時器的代碼如下()調用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運行的服務可能無權從睡眠中恢復。嘗試以自己身份運行該服務,或者專門爲要運行的服務創建一個服務帳戶。

如果您已經將該服務作爲特定用戶運行,那麼該用戶帳戶的權限可能不足。