Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
Необходимо будет или изменить сервис или обернуть его в процессе помощника: кроме проблем доступа сессии/диска, персистентные отображения диска только восстанавливаются на интерактивном входе в систему, который обычно не выполняют сервисы.
подход процесса помощника может быть довольно простым: просто создайте новый сервис, который подключает диск и запускает 'реальный' сервис. Единственные вещи, которые не совсем тривиальны об этом:
сервис помощника должен будет передать все соответствующие команды SCM (запустите/остановите, и т.д.) к реальному сервису. Если реальный сервис примет пользовательские команды SCM, не забудьте передавать тех также (то я не ожидаю сервис, который считает пути UNC экзотичными для использования таких команд, хотя...)
Вещи могут стать немного хитрыми мудрый учетными данными. Если реальная услуга работает в соответствии с учетной записью обычного пользователя, можно выполнить сервис помощника в соответствии с той учетной записью также, и все должны быть в порядке, пока учетная запись имеет соответствующий доступ к сетевому ресурсу. Если реальный сервис будет только работать, когда выполнено LOCALSYSTEM или somesuch, вещи становятся более интересными, им или не будут в состоянии 'видеть' сетевой диск вообще или потребовать, чтобы некоторое учетное манипулирование получило вещи работать.
Вы wan't для или изменения пользователя, что Сервисные выполнения под от "Системы" или находят подлый способ выполнить отображение как Систему.
забавная вещь состоит в том, что это возможно при помощи "в" команда, просто запланируйте свой диск, отображающий одну минуту в будущее, и это будет выполнено в соответствии с Системной учетной записью, делающей диск, видимый в Вашу службу.
Вы могли нас 'сетевое использование' команда:
var p = System.Diagnostics.Process.Start("net.exe", "use K: \\\\Server\\path");
var isCompleted = p.WaitForExit(5000);
, Если это не работает в сервисе, попробуйте Редактирование PInvoke WNetAddConnection2
и Winapi: , Очевидно, я неправильно понял Вас - Вы не можете изменить исходный код сервиса, правильно? В этом случае я следовал бы за предложением mdb, но с небольшим скручиванием: Создайте свой собственный сервис (позволяет, называют его сервисом отображения), который подключает диск, и добавьте этот сервис отображения к зависимостям для первого (фактическая работа) сервис. Тем путем рабочий сервис не запустится, прежде чем сервис отображения запустил (и подключил диск).