Есть оконное EXE-приложение.
возникла необходимость управлять им из vb-прог
как я понимаю, нужно создавать com-обьект. но с com-обьектами в exe я не сталкивался.
как правильно подойти к этому делу? разумеется необходимо, чтобы текущая функциональность программы
сохранилась. Она кстати, написана на голом win-api поэтому интересует, также, стоит ли переделывать проект в ATL (написано уже немало) или без ATL гемора еще больше будет?
Здравствуйте malloc, Вы писали:
M>Есть оконное EXE-приложение.
M>возникла необходимость управлять им из vb-прог
M>как я понимаю, нужно создавать com-обьект. но с com-обьектами в exe я не сталкивался.
Значит самое время!
M>как правильно подойти к этому делу? разумеется необходимо, чтобы текущая функциональность программы
M>сохранилась. Она кстати, написана на голом win-api поэтому интересует, также, стоит ли переделывать проект в ATL (написано уже немало) или без ATL гемора еще больше будет?
Писать COM на голом API можно, но только если есть лишних два месяца или собственные наработки на этом поприще. Так как "с com-обьектами в exe я не сталкивался", то лучше воспользоваться ATL-ом.
Как проще делать:
Для EXE-COM-сервера созданного на ATL самая необходимая часть лежит в cpp-файле имеющем тоже имя что и проект.
Единственное что у тебя может пересечься это функция WinMain и цикл обработки сообщений.
Проще всего создать новый ATL-проект и выдрать из него все необходимое (практически все).
Далее нужно внимательно проанализировать свою WinMain и цикл обработки сообщений и тоже самое из ATL-а. Внести свои особенности в ATL-ьную реализацию и ... собственно все.
Главное помнить что программа может быть запущена как COM-сервер и при этом окна и диалоги могут серьезно мешать, так что все прикладные функции нужно вынести в новый COM-объект, а в окнах и диалогах вызывать именно методы этгого объекта.
PS
ATL (ири грамотном его использовании) дает очень незначительный оверхэд. ATL не зависит ни от каких внешних библиотек (ну, разве что ATL.DLL, но от нее тоже можно избавиться при использовании _ATL_STATIC...).