2012-01-24 2 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; 
} 

Я добавил OutputDebugString («цикл оболочки введен») в начале цикла приложения оболочки. Я также добавил OutputDebugString («Ожидание объекта») перед вызовом WaitForSingleObject()

Петля, кажется, висит на WaitForSingleObject. Последнее сообщение в DbgView - «Ожидание объекта».

+0

Что такое «Сон (10000)»? –

+0

Ну, сначала, когда служба не была установлена, мне нужно было ее замедлить. Я оставил его, потому что хотел, чтобы он стрелял примерно каждые десять секунд. Может ли это вызвать проблему? – rbuddicom

ответ

0

Могло быть много причин. Я бы рекомендовал вам добавить вызовы OutputDebugString() (функция Win32 API) и получить DbgView.exe от Microsoft, чтобы узнать, что происходит. Кроме того, не похоже, что вы это делаете, но убедитесь, что вы не пишете на подключенный диск или сетевое местоположение, поскольку ваш сервис, скорее всего, не имеет к ним доступа.

+0

Только что попробовал Dbgview.exe, и havnt удалось отследить его, он, кажется, запускает цикл только один раз. Может ли WaitForSingleObject() вызвать эту проблему? – rbuddicom

0

При настройке службы Windows вы указали учетную запись на вкладке «Вход в систему»? http://www.coretechnologies.com/WindowsServices/FAQ.html#AppNotWorkingFromService

Учетная запись локальной системы по умолчанию почти наверняка не имеет прав на использование принтеров, поэтому обязательно установите учетную запись, которая может нормально обращаться к принтерам.

+0

Я этого не сделал, однако он будет запускать цикл один раз. Он отлично подходит к принтерам, сбрасывает всю информацию в файл и обычно работает точно так, как ожидалось. Он просто не зацикливается. Протестируйте вход в систему из моей учетной записи администратора, и он все еще запускает цикл только один раз. – rbuddicom

+0

Можете ли вы разместить код вокруг вызова WaitForSingleObject, который вы описываете выше? – CoreTech

+0

Я собирался, и я заметил недостающую Do в верхней части цикла, проблема решена! Я чувствую себя идиотом ... – rbuddicom

Смежные вопросы