Текущий архив: 2010.12.26;
Скачать: CL | DM;
Вниз
Написание собственного COM сервера автоматизации Найти похожие ветки
← →
Unknown_user (2010-09-15 18:59) [0]Хочу встроить в приложение свой COM сервер. Хочу превратить необходимые классы приложения в компонентные классы, реализующие методы интерфейсов. Отключил подсчет ссылок своей реализацией _AddRef и _Relase. Скомпилировал свой COM сервер как dll. Поключил ее в MS Word, VBA - вылет на первом методе объекта, возвращающем интерфейс. Методы, возвращающие простые типы отрабатывают нормально. В делфи такой вызов работает без проблем, как внутри процесса так и в другом процессе.
Как вообще строятся COM сервера? Неужели пишутся копии нужных классов со своей реализацией?
← →
Владислав © (2010-09-15 21:38) [1]
> Отключил подсчет ссылок своей реализацией _AddRef и _Relase.
Зачем?
А вообще, ошибка, как обычно, в 13 строке...
← →
Unknown_user (2010-09-16 00:26) [2]>Владислав
А зачем это делается в TComponent? Чтобы самостоятельно управлять временем жизни объекта. Например объект параграф не имеет смысла без объекта документ. Поэтому при удалении документа удаляются и все его параграфы.
Ну а как по-правильному?
← →
Дмитрий Тимохов (2010-09-16 00:33) [3]Есть хорошая книга по тематике. Я думаю, что тебе надо ее почитать.
Вот она http://www.books.ru/shop/books/122589
Я давно по ней что-то писал. Книга очень продвинутая. Без нее "плавать" будешь.
По самому вопросу ничего не скажу - давно этим не занимался.
← →
Аноним (2010-09-16 03:27) [4]
> По самому вопросу ничего не скажу - давно этим не занимался.
отлично характеризует книгу
← →
Дмитрий Тимохов (2010-09-16 09:26) [5]
> Аноним (16.09.10 03:27) [4]
> > По самому вопросу ничего не скажу - давно этим не занимался.
> отлично характеризует книгу
Это отлично характеризует меня ))
У меня дел много, и все помнить головы не хватит. Но надо знать где найти.
А книга правда хорошая, пусть почитает. Тем более дело, как я вижу, не разовое - сделал и забыл, а надо добавить в приложение новый по сути функционал и еще его поддерживать потом. Наскоками на ДМ знаний не получишь, имхо.
← →
Unknown_user (2010-09-16 09:41) [6]>Дмитрий Тимохов
Спасибо за совет. Книгу обязательно почитаю. А вот по теме бы еще хотелось услышать рекомендации. Мне просто нужен стратегический совет.
Как вообще это делается? Неужели создаются копии всех классов, которые нужно предоставить клиенту СОМ сервера? Нерационально. Если же копии классов не создавать, тогда чтобы не смешивать интерфейсные и объектные ссылки, нужно использовать лишь интерфейсы. В этом случае можно оставить автоматическое управление временем жизни компонентных объектов. Но интерфейсы ведь не реализуют весь необходимый функционал! Внутри программы нужно использовать также методы классов, которые не вынесены в интерфейс. Не говоря уже про прямой доступ к полям объекта.
Так все же. Как это делается по-правильному?
← →
Empleado © (2010-09-16 10:54) [7]>Как вообще это делается?
"Основы COM" Дейл Роджерсон
← →
Дмитрий Тимохов (2010-09-16 11:27) [8]
> Unknown_user (16.09.10 09:41) [6]
Я делал копией. Из сервера вызывал нужные классы.
← →
Владислав © (2010-09-17 09:36) [9]
> Чтобы самостоятельно управлять временем жизни объекта. Например
> объект параграф не имеет смысла без объекта документ. Поэтому
> при удалении документа удаляются и все его параграфы.
>
> Ну а как по-правильному?
По правильному объект "документ" должен жить, пока существуют ссылки на объект "параграф". В самом простом случае можно увеличить счетчик ссылок у "документа" при создании "параграфа" и уменьшить его при разрушении "параграфа". Но уж никак не убивать "параграфы", когда счетчик ссылок на "документ" обнулился.
> Но интерфейсы ведь не реализуют весь необходимый функционал!
> Внутри программы нужно использовать также методы классов,
> которые не вынесены в интерфейс. Не говоря уже про прямой
> доступ к полям объекта.
Плохая идея. Кроме того, что разработка усложнится, еще и в итоге потерянные ссылки придется искать при отладке.
> Так все же. Как это делается по-правильному?
Кусочек кода жалко показать?
А в сферическом классе в вакууме можно реализовать интерфейс, и уже этот интерфейс отдавать клиенту.
← →
Unknown_user (2010-09-17 13:58) [10]Вот исходники
http://www.geosystema.net/Test.zip
Создавалось в D2009. При запуске Build\Marfa.exe регистрируется COM сервер, который находится в библиотеке Build\Main.dll.
В модуле MRFMain.pas примеры использования COM сервера в делфи. Испытывался как внутрипроцессный так и внепроцессный варианты. В делфи все работает отлично.
При запуске VB скрипта Build\script.vbs на методе, возвращающем интерфейс для только что добавленного объекта возникает сбой. Аналогичный сбой возникает и при запуске VBA макроса в MS Word. Макрос лежит в файле Build\Doc1.doc.
Я расставил ShowMessage в различных методах для отладки в модуле Source\MRFProject.pas. Убирайте, если мешают.
← →
Unknown_user (2010-09-18 09:35) [11]Нашел причину. Всем спасибо. Вместо IDispatch наследовал некоторые интерфейсы от IUnknown. Поэтому и работало в делфи и не работало в языках, не использующих указатели.
Страницы: 1 вся ветка
Текущий архив: 2010.12.26;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.01 c