2014-12-10 2 views
0

Я написал клиентское (консольное) приложение C++ DDE, которое ведет переговоры с сторонним сервером dde. Это отлично работает, когда мой клиент и сервер находятся в одном сеансе. Затем я переместил код клиента в службу win32, запущенную как SYSTEM. Клиентский код не может получить список серверов, несмотря на попытку: 1. Я попытался включить «Разрешить службу для взаимодействия с рабочим столом» на Win7. 2. Я олицетворял пользователя в потоке, который пытается поговорить с сервером. 3 Я попытался выполнить клиентский код как систему.Клиент DDE в сервисе, разговаривающий с сервером в сеансе пользователя

Я могу понять, что основная проблема связана с несколькими сеансами. Но есть ли способ добиться элегантности?

ответ

0

Начиная с Vista, «интерактивные» услуги больше не работают из-за Сессия 0 Изоляция.

DDE - это технология на основе User32 (она использует внутренние окна) и поэтому не может использоваться в границах сеанса.

Чтобы сделать то, что вы пытаетесь сделать, вам необходимо создать отдельное несервисное приложение, которое выполняется в контексте пользовательского сеанса, и при необходимости использует DDE, обмениваясь данными с услугой через сеанс-агностик IPC механизм, такой как именованный канал, сокет или COM-объект. Служба может использовать WTSQueryUserToken() и CreateProcessAsUser() для запуска приложения в конкретном сеансе пользователя, когда это необходимо. Или вы можете настроить приложение на автоматический запуск, когда пользователь входит в систему.

+0

Именно это я и решил сделать. Но я просто пытался выяснить, есть ли что-то, что я пропустил, что может помочь мне, не создавая отдельный процесс в пользовательском контексте. – Sri

+0

Нет другой альтернативы, если вам нужно использовать DDE. –

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