Есть необходимость написать EXE-сервер автоматизации с GUI.
При этом необходимо реализовать следующие особенности:
1. Сам сервер реализовать на ATL
2. GUI сервера реализовать в отдельном компоненте (для которого сам сервер является клиентом) на ATL, VB, MFC или чем-то еще и может, в принципе, выбираться сервером из нескольких компонентов, например категории SomeGUICat
3. Сервер должен иметь возможность обновлять ("перерисовывать" GUI), а GUI может вызывать методы сервера
4. Сервер может просто запускаться и функционировать как обычная программа (без COM-клиента сервера)
5. Сервер, по желанию клиента, может вообще не отображать свой GUI
Общая идея создания GUI-компонента такова:
Server::Run(BOOL fGUI)
{
...
if(fGUI)
{
GUI pGUI = NULL;
hresult = CreateInstance(..., &pGUI);
pGUI->Show(this); // to get GUI possibility to call the server
}
...
}
При этом возникают некоторые вопросы:
1. Как организоватьвзаимосвязь между сервером и GUI, когда они одновременно являются серверами и клиентами друг друга?
2. Как, например, реализовать GUI на VB? Простая тестовая программа показывает, что при такой конфигурации VB не может создать немодальное окно приложения, а модальное окно приведет к deadlock'у сервера.
3. Как инициализировать сервер, если он запущен как обычное приложени? Иными словами, если сервер имеет какой-то головной объект (скажем Application), то как и где его при этом создавать и удалять?
Если у кого-либо есть соображения по этим вопросом, буду очень признателен, если вы выскажетесь!
Если есть возможность отдать человеку все, не прося ничего взамен — отдай. Если тебе один раз из десяти долг отдадут — будешь богатым.