Как общаться с сервисом окон из приложения, которое взаимодействует с рабочим столом?

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

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

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
17
задан Kris Erickson 22 December 2010 в 16:04
поделиться

7 ответов

Знайте, что, если Вы планируете в конечном счете развернуться на Windows Vista или Windows Server 2008, много способов, которыми это может быть сделано сегодня, не будут работать. Это из-за введения нового средства защиты, названного "Сессия 0 Изоляции".

сервисы окон Most были перемещены для выполнения на Сессии 0 теперь для надлежащей изоляции их от остальной части системы. Расширение этого состоит в том, что первый пользователь, который войдет в систему больше, не размещается в Сессию № 0, они размещаются в Сессию 1. И следовательно, изоляция взломает код, который делает определенные типы коммуникации между сервисами и настольными приложениями.

лучший способ написать код сегодня, который будет работать над Vista и продвижением Server 2008 года при выполнении коммуникации между сервисами и приложениями, состоит в том, чтобы использовать надлежащий межпроцессный API как RPC, Именованные каналы, и т.д. не используйте SendMessage/PostMessage, поскольку это приведет к сбою под Сессией 0 Изоляции.

http://www.microsoft.com/whdc/system/vista/services.mspx

Теперь, учитывая Ваши требования, Вы собираетесь быть в чем-то вроде рассола. Для межплатформенных проблем я не уверен, поддерживалась ли Дистанционная работа. Вы можете иметь к выпадающему и перейти полностью назад к сокетам: http://msdn.microsoft.com/en-us/library/system.net.sockets.aspx

17
ответ дан 30 November 2019 в 12:14
поделиться

Если это - приложение лотка и не истинный сервис, опасаются, как Вы настраиваете свою связь при использовании каналов или TCP/IP. Если многочисленные пользователи зарегистрированы в машину (Citrix, Удаленный рабочий стол), и каждый пользователь запускает приложение лотка "сервис", то можно столкнуться с ситуацией, где у Вас есть несколько процессов, пытающихся использовать тот же стандартный порт или канал. Конечно, это не проблема, если Вы не планируете поддержку нескольких каналов или если у Вас есть истинный сервис в противоположность приложению лотка, которое работает в каждой пользовательской оболочке.

4
ответ дан 30 November 2019 в 12:14
поделиться

Дистанционная работа является опцией, но это не является межплатформенным. Некоторые другие пути состоят в том, чтобы использовать именованные каналы, IPC или события ядра.

2
ответ дан 30 November 2019 в 12:14
поделиться

Сделайте, чтобы Ваш сервис слушал 127.0.0.1 на предопределенном порте с простым потоковым сокетом TCP. Соединитесь с тем портом от своего настольного приложения.

Это очень просто, и это является абсолютно кросс-платформенным.

3
ответ дан 30 November 2019 в 12:14
поделиться

Странно достаточно я собирался предложить Дистанционную работу! Моно 1.0 Информации о версии (с archive.org, потому что исходное местоположение отсутствует) упоминает System.Runtime.Remoting.dll как поддерживаемую библиотеку, и ничего не говорит об известных проблемах.

, Если дистанционная работа отсутствует затем, вероятно, необходимо реализовать собственное сообщение TCP, структурирующее протокол. Windows не имеет эквивалента доменных UNIX сокетов для коммуникации на той же машине.

2
ответ дан 30 November 2019 в 12:14
поделиться

Большинство сервисов, которые имеют компонент графического интерфейса пользователя, выполняется как именованный пользователь и разрешено доступ к рабочему столу. Это позволяет Вам получить доступ к нему через COM или.NET, но только локально (если Вы не хотите быть сложными)

Лично, я открываю обычный старый сокет на сервисе - его кросс-платформенное, позволяет нескольким клиентам, позволяет любому приложению получать доступ к нему, не полагается на безопасность Windows, которая будет открыта для него и позволяет Вашему GUI быть записанным на любом языке, который Вы любите (поскольку все поддерживает сокеты).

Для приложения лотка, Вы хотели бы, чтобы простой протокол связался - Вы могли бы также использовать систему стиля REST для отправки команд в него и потока XML (гогот) или пользовательский формат данных назад.

2
ответ дан 30 November 2019 в 12:14
поделиться

Кто-нибудь из вас действительно пробовал удаленное взаимодействие с Mono? Работает отлично. Вы можете столкнуться с некоторыми угловыми случаями, но это маловероятно. Просто время от времени тестируйте свое приложение на кроссплатформенное (MS.Net <-> Mono) удаленное взаимодействие, чтобы выявить возможные сбои. И начнем с недавнего Mono, сейчас 2.4.2.

Mono) время от времени удаленное взаимодействие, чтобы отловить возможные сбои. И начнем с недавнего Mono, сейчас 2.4.2.

Mono) время от времени удаленное взаимодействие, чтобы отловить возможные сбои. И начнем с недавнего Mono, сейчас 2.4.2.

3
ответ дан 30 November 2019 в 12:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: