Почему не работают соединения QLocalSocket / Server, когда один процесс был вызван установщиком NSIS? - PullRequest
1 голос
/ 22 августа 2010

У меня есть установщик NSIS, который устанавливает мое приложение Qt.В конце процесса установки программа установки дает пользователю возможность немедленно запустить приложение.

Мое приложение использует QLocalSocket / QLocalServer для связи с другими локальными экземплярами приложения.(Они общаются друг с другом в основном только для того, чтобы убедиться, что одновременно запускается только один экземпляр приложения.) Однако в Vista, если один из экземпляров был запущен установщиком, другие экземпляры не могут общаться с этим экземпляром, если толькоони также были запущены установщиком (или, что интересно, деинсталлятором).

Установщик NSIS запускает приложение с помощью команды Exec.Клиент пытается подключиться к серверу через QLocalSocket :: connectToServer, который завершается ошибкой «QLocalSocket :: connectToServer: неизвестная ошибка 5».

Кто-нибудь может это объяснить?Какой лучший способ обойти это?

Ответы [ 2 ]

1 голос
/ 22 августа 2010

Если 5 - код ошибки Windows, это будет означать, что доступ запрещен. Есть ли способ изменить защиту на этом сервере (вам потребуется доступ к собственному дескриптору канала)?

Параметр запуска конечной страницы имеет больше проблем, чем этот, новый процесс получает неправильный HKCU и профиль пользователя и т. Д.

Я бы порекомендовал просто отключить флажок запуска на конечной странице. (Эта проблема полностью восходит к win2000, когда был добавлен RunAs)

Если вы действительно хотите установить этот флажок, вы можете использовать плагин UAC , который позволит вам запустить дочерний процесс как «правильный» пользователь.

1 голос
/ 22 августа 2010

Наконец-то понял это.Программа установки работала от имени администратора (сценарий установки сказал «RequestExecutionLevel admin»), и, очевидно, она запустила мое приложение с такими повышенными разрешениями, что означало, что другие экземпляры моего приложения, работающие с разрешениями уровня пользователя, не могли подключиться к нему.QLocalSocket / Server использует именованные каналы в Windows, поэтому я полагаю, что это функция безопасности Windows.Я планирую обойти это, используя плагин UAC NSIS, который, как я считаю, позволяет запускать процесс с разрешениями на уровне пользователя.

...