Почему моя служба Windows непрерывно записывает в файл? - PullRequest
0 голосов
/ 24 января 2012

Я создал службу Windows, которая проверяет установленные принтеры и обновляет файл, в настоящее время расположенный по адресу "C: \ App \ Data \ info" (без расширения файла). Очень просто, все, что он делает, это вызывает EnumPrinters с правильными флагами и дампами. PRINTER_INFO_2 в файл.

Все работает точно так, как ожидалось в 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 - «Ожидание объекта».

Ответы [ 2 ]

0 голосов
/ 24 января 2012

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

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

0 голосов
/ 24 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...