![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Konst |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 28.8.2003 Репутация: нет Всего: нет |
Делаю библиотеку dll с абстракным классом.
На этой библиотеке создаю COM объект. Хочу вызвать это виртуальный метод COM объекта, но уже переопределенный. А переопределить я его могу вот так:
Как это сделать? Возможно ли это? |
||||
|
|||||
| RAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
Только так и можно.
Абстрактный класс должен быть интерфейсом. В объекте COM ты реализуешь класс на основе этого интерефейса (cppserverclass), в нём будет опредерена твоя виртуальная функция. И она будет возвращать пять. Если в будущем ты создашь другой COM объект, который будет поддерживать этот интерфейс, ты сможешь в нём переопределить виртуальные функции по другому. И получишь универсальный алгоритм доступа к разным объектам COM через единый интерфейс. |
|||
|
||||
| Konst |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 23 Регистрация: 28.8.2003 Репутация: нет Всего: нет |
Т.е. у меня будет запущено 2 COM, один из которых содержит абстрактный класс (интерфейс), а другой COM содержит derivative интерфейс от того абстрактного класса. Мы вызываем виртуальный метод абстрактного класса и вызывается витруальный метод наследника Кажется что это не сработает. Прведи пример кода пожалуйста. |
|||
|
||||
| RAN |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
Ну, на интерфейсах весь COM и держиться. По-моему, ты под COM что-то другое понимаешь. Попробуй сам полностью написать один небольшой COM объект (причём без ATL и тому подобного) и всё встанет на свои места. Теперь по сути: Сервер COM будет запущен один. Он будет содержать не derivative интерфейс, а derivative класс. Интерфейс - это абстрактный класс, лежащий в основе классов (ну, или других интерфейсов), реализуемых в dll, COM сервера.
Мы сразу будем попадать на метод наследника, потому что у нас его виртуальная таблица.
В этом вся и фишка. Пишется интерфейс, содержащий чисто виртуальные методы. В результате в этот интерфейс попадает указатель на таблицу виртуальных функций. В этой таблице по очереди содержаться адреса методов (в интерфейсе - это нули, они же виртуальны). Потом вывзывается CoCreateInstance( id компанента, NULL, CLSCTX_INPROC_SERVER, id интерфейса, reinterpret_cast<void**>(&pComObj)); Здесь pComObj - это указатель на объект: IYourInterface* pComObj; (IYourInterface - тот самый интерфейс). После вызова CoCreateInstance в объекте указатель на таблицу виртуальных функций меняется на новую, командой static_cast<IYourInterface *>(this); (Это происходит внутри COM сервера). То есть сервер подсовывает тебе свою (this) vtable. Надеюсь, что-то понятно. А примером может служить интерфейс IUnknown - его поддерживают все COM, или IDispatch - его поддерживают почти все серверы. |
||||||
|
|||||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |