2012-01-24 85 views
0

我創建了一個windows服務,用於檢查已安裝的打印機並更新當前位於「C:\ App \ Data \ info」(無文件擴展名)的文件非常簡單,只需調用帶有正確標誌和轉儲的EnumPrinters PRINTER_INFO_2到一個文件。爲什麼我的windows服務不斷地寫入文件?

在「測試」項目中,一切與Visual Studio 2010中的預期完全相同,導致我相信問題不在我的服務中。只要我將其安裝爲Windows服務,就會停止循環。它將通過循環運行一次,永不再次。

代碼參考:
我現在用的模板從這裏:http://www.kencotutorials.com/WindowsService.aspx 並不僅改變了服務類文件。

最初的想法是安全權限或等待功能不返回。

編輯:我已經檢查過整個文件系統,看它是否被寫入其他地方並確認它不是。

這是模板調用的服務循環函數。

void CMyService::MyServiceLoop(void) 
{ 
    CheckPrinters(); // updates a PRINTER_INFO_2 struct with all installed printers 
    WritePrinterFile(); // writes the file (i know there's no issue with the actual writing) 

    Sleep(10000); 
    OutputDebugString("Done sleeping"); 
    Return; 
} 

我在shell應用程序循環的開始處添加了OutputDebugString(「Shell loop entered」)。 我還在WaitForSingleObject()的調用前添加了OutputDebugString(「Waiting for object」)

該循環似乎掛在WaitForSingleObject上。 DbgView中的最後一條消息是「等待對象」。

+0

什麼是「睡眠(10000)」在那裏做? –

+0

最初,當服務沒有安裝時,我需要減慢速度。我把它放在裏面,因爲我希望它每十秒鐘就會發射一次。這是否會導致問題? – rbuddicom

回答

0

可能是很多原因。我建議您添加一些OutputDebugString()調用(Win32 API函數)並從Microsoft獲取DbgView.exe以查看正在發生的事情。此外,聽起來不像你這樣做,但確保你沒有寫入映射的驅動器或網絡位置,因爲你的服務很可能無法訪問這些。

+0

剛剛嘗試過Dbgview.exe,並且havnt設法追蹤它,它似乎只運行一次循環。可能WaitForSingleObject()導致這個問題? – rbuddicom

0

當您設置Windows服務時,您是否在登錄選項卡上指定了一個帳戶? http://www.coretechnologies.com/WindowsServices/FAQ.html#AppNotWorkingFromService

默認的本地系統帳戶幾乎肯定無權使用打印機,因此請務必設置可正常訪問打印機的帳戶。

+0

我沒有,但它會運行一次循環。它完美地訪問打印機,將所有信息轉儲到文件中,並且一般按預期工作。它只是不循環。已經從我的管理員帳戶測試過日誌,它仍然只運行一次循環。 – rbuddicom

+0

你可以請你圍繞上面描述的WaitForSingleObject調用發佈代碼嗎? – CoreTech

+0

我正要和我注意到循環頂部缺少一個Do,問題解決了!我覺得自己像一個白癡... – rbuddicom

相關問題