Вызов метода DLL возвращает разные результаты при вызове из службы Windows - PullRequest
0 голосов
/ 03 июня 2011

У меня есть программа, которую я конвертирую в службу Windows (на C #). Эта программа взаимодействует с внешней DLL, у которой есть метод, который возвращает объект. Объект показывает состояние другой запущенной программы (запущена ли она и зарегистрирована ли программа)

С предыдущей реализацией все работало нормально. Вызов DLL для получения объекта с переменными состояния работал нормально. Теперь, когда я переместил вызов этого метода в службу Windows, он возвращает неправильные значения. Вызов метода DLL возвращает объект состояния, но значения всегда показывают, что программа не запущена или не вошла в систему (если она явно есть).

Я понятия не имею, почему вызов этого метода DLL внутри службы Windows должен изменить возвращаемые переменные.

Что я могу сделать, чтобы убедиться, что вызов DLL работает так, как задумано?

У меня нет доступа к коду DLL, поэтому изменения не могут быть внесены туда.

Вот пример:

AppStateDLL.AppStateObject stateObject = new AppStateDLL.AppStateObject();
if (!stateObject.Online || !stateObject.LoggedIn)
{
    //things are broken, because the program is always running and logged in
}

(имена составлены, но вы поняли)
Если я запускаю этот код в объекте Windows Forms, для свойств stateObject свойства Online и LoggedIn устанавливаются как true, поэтому все хорошо. Если я запускаю код из службы Windows, для обеих переменных возвращается false.

И моя служба Windows настроена с доступом по локальной системе, что, я считаю, должно означать, что у нее не должно быть проблем с разрешениями и тому подобным.

Спасибо

Ответы [ 2 ]

1 голос
/ 03 июня 2011

Я предполагаю, что проблема в том, что служба работает в другом сеансе и, следовательно, отличается от рабочего стола приложения, состояние которого оно пытается сообщить.

Эта DLL-библиотека, вероятно, вызывает EnumWindow для поиска приложения, и она не может найти его при запуске с другого рабочего стола.

1 голос
/ 03 июня 2011

Ну, поскольку мы ничего не знаем о внутренностях вашего AppStateObject, я могу только сделать приблизительное предположение.Вы сказали нам

Объект показывает состояние другой запущенной программы

Возможно, он правильно показывает только состояние другой программы, если обе программы работают в одном и том же контексте пользователя.?Что может быть не так, когда ваша программа запускается как служба?

...