Здравствуйте!
Передо мной встала задача написать сервис с MFC (с пользовательским интерфейсом — иконка в трее, диалоговые окна). Проблема в том, что не получается выводить диалоговое окно так, чтобы оно полностью прорисовывалось и реагировало на действия пользователя.
Если вызывать диалог до StartServiceCtrlDispatcher(), то он не реагирует на действия пользователя, если после — появляется только после завершения работы сервиса (т.е. StartServiceCtrlDispatcher() возвращает управление только после остановки службы).
Подскажите, пожалуйста, как это все реализовать. Варианты с отделением юзер-интерфейса в отдельное приложение или использования srvany не подходят. Знаю, что сервис с MFC возможен (да и в архивах форума сообщения об этом есть), но вот материалов по реализации не нашел.
27.04.06 19:20: Перенесено модератором из 'C/C++' — Кодт
Здравствуйте, Aracon, Вы писали:
A>Подскажите, пожалуйста, как это все реализовать. Варианты с отделением юзер-интерфейса в отдельное приложение или использования srvany не подходят.
Вариант с отделением юзер-интерфейса есть самый правильный с точки зрения security. Если он не подходит, то возникает вопрос "почему"? ("Может что-то в консерватории подправить?.."(С)

)
Здравствуйте, Игорь Вартанов, Вы писали:
A>>Подскажите, пожалуйста, как это все реализовать. Варианты с отделением юзер-интерфейса в отдельное приложение или использования srvany не подходят.
ИВ>Вариант с отделением юзер-интерфейса есть самый правильный с точки зрения security. Если он не подходит, то возникает вопрос "почему"? ("Может что-то в консерватории подправить?.."(С)
)
Потому что заказчику хочется, чтобы был один exe-шник.
А создавать окно в ServMain не пробовали. Хотя ИМХО правильно предложили насчёт 2 в 1 в зависимости от ключей. Например запуск без ключей — запускает интерфейс, а запуск с ключом /service запускает сервис.
Здравствуйте, Аноним, Вы писали:
А>А создавать окно в ServMain не пробовали. Хотя ИМХО правильно предложили насчёт 2 в 1 в зависимости от ключей. Например запуск без ключей — запускает интерфейс, а запуск с ключом /service запускает сервис.
Говорено-переговорено уже — нельзя в сервисе запускать гуевый мотлох, т.к. любой хук позволит внедриться в процесс сервиса. Если при этом не приняты меры по снижению прав для треда, крутящего гуй, то все плохо...
Отдельный вопрос — определение момента, когда нужно показать гуй. Не стоит сервису морочиться с этим, проще поручить запуск гуя либо шеллу (либо через реестр, либо через Startup меню), либо самому юзеру делать это вручную.
Кстати, способов использовать dll (надеюсь, против dll заказчик не имеет возражений) в качестве контейнера для гуевого кода можно придумать минимум два:
всадить GUI dll в explorer.exe через CreateRemoteThread,
запускать ее как in-proc COM server в суррогатном процессе
Вобщем это уже вопрос предпочтений, умения и фантазии...