2014-01-16 7 views
0

У нас есть 64-битное приложение, работающее как служба на Windows 7 64bit. Когда мы запускаем сервис вручную, он отлично работает каждый раз. Когда служба запускается автоматически при запуске системы, иногда (например, 1 из 10) она терпит неудачу. Проблема заключается в функции LoadLibrary, которая на самом деле является первой, что она делает. Это большая часть нашей DLL, где большая часть кода. Я не могу воспроизвести его на своих компьютерах, поэтому я просто отправляю специальные тестовые файлы для коллег за границу. Я добавил текстовые выходы в файл, используя небуферизованную операцию записи, чтобы я мог видеть, где именно она исчезает. Нет дампа сбоя, исключений нет, нет NULL, извлеченного, он просто выходит где-то в LoadLibrary, и служба не запускается после запуска системы. В нашей библиотеке нет DllMain, но если я добавлю ее, она не будет там (в случае сбоя). Я пробовал задерживать загрузку зависимых системных библиотек, без успеха. Кажется, что иногда что-то еще не запускается в Windows, и поэтому инициализация терпит неудачу, я не уверен. Но добавление сна до того, как LoadLibrary не решит проблему (слишком поздно спать?). У вас есть идеи, что происходит и как действовать? В настоящее время я собираюсь удалить код из нашей DLL шаг за шагом, чтобы удалить зависимостей lib один за другим, чтобы убедиться, что в какой-то момент он начнет работать. Я буду рад предоставить дополнительную информацию по мере необходимости.LoadLibrary иногда не работает при запуске службы

+0

Это нормально для службы, чтобы иметь зависимость от других сервисов, которые должны функционировать до того, как она начнется. Явная конфигурация для Windows, Панель управления + Административные службы, щелкните правой кнопкой мыши вашу службу, вкладка «Свойства», «Зависимости». Выяснить, какое обслуживание вам нужно, нельзя угадать из вопроса. Но можно, конечно, обнаружить проб и ошибок. Посмотрите через зависимости других сервисов, которые выполняют аналогичную работу. –

+0

Да, возможно, нам нужна некоторая зависимость, которая еще не началась в 1 из 10 случаев, потому что порядок услуг меняется. Но тогда я бы предположил, что, например, 15 секундный сон (хотя и не очень хорошее решение, конечно) поможет. Но это не так. Очень сложно сказать, какая зависимость службы требуется, если мы еще не вызываем какую-либо функцию, просто загрузите нашу библиотеку DLL. Я также могу изменить поведение, чтобы загрузить его статически, возможно, он расскажет нам больше из журнала службы или чего-то еще. – Martin

+0

Здесь вы можете увидеть наши дополнительные библиотечные зависимости нашей проблемной DLL, возможно, вы узнаете, какой сервис нам нужно дождаться, чтобы загрузить их должным образом: kernel32.lib; user32.lib; gdi32.lib; winspool.lib; shell32.lib ; ole32.lib; oleaut32.lib; uuid.lib; comdlg32.lib; advapi32.lib; secur32.lib; ws2_32.lib; libeay32.lib; icuin.lib; icuuc.lib; zlibstatic.lib – Martin

ответ

0

Приложение Lenovo RapidBoot Shield было причиной.

«RapidBoot Shield работает, задерживая некритические приложения и службы, чтобы ускорить загрузку вашей системы. Однако в некоторых случаях RapidBoot Shield может задерживать приложение и/или службу, критическую для запуска системы. система загружается медленнее, чем ожидалось, или некоторые приложения могут не запускаться нормально ».

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