Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Виртуальные методы в COM объекте, при создании COM через dll 
:(
    Опции темы
Konst
  Дата 10.9.2003, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 28.8.2003

Репутация: нет
Всего: нет



Делаю библиотеку dll с абстракным классом.
Код

public __gc  class cppserverclass:public cppserver
{
public:
virtual int IntermideateFunc()=0;
};

На этой библиотеке создаю COM объект.
Хочу вызвать это виртуальный метод COM объекта, но уже переопределенный.
А переопределить я его могу вот так:
Код
int IntermideateFunc() { return 5; };


Как это сделать? Возможно ли это?

PM MAIL   Вверх
RAN
Дата 10.9.2003, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

Репутация: 5
Всего: 6



Только так и можно.
Абстрактный класс должен быть интерфейсом. В объекте COM ты реализуешь класс на основе этого интерефейса (cppserverclass), в нём будет опредерена твоя виртуальная функция. И она будет возвращать пять.

Если в будущем ты создашь другой COM объект, который будет поддерживать этот интерфейс, ты сможешь в нём переопределить виртуальные функции по другому. И получишь универсальный алгоритм доступа к разным объектам COM через единый интерфейс.
PM MAIL ICQ   Вверх
Konst
Дата 11.9.2003, 05:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 28.8.2003

Репутация: нет
Всего: нет



Цитата(RAN @ 10.9.2003, 20:15)
Если в будущем ты создашь другой COM объект, который будет поддерживать этот интерфейс, ты сможешь в нём переопределить виртуальные функции по другому. И получишь универсальный алгоритм доступа к разным объектам COM через единый интерфейс.

Т.е. у меня будет запущено 2 COM, один из которых содержит абстрактный класс (интерфейс), а другой COM содержит derivative интерфейс от того абстрактного класса. Мы вызываем виртуальный метод абстрактного класса и вызывается витруальный метод наследникаconfused.gif Странно. У них же таблицы виртуальных функций разные. bored.gif
Кажется что это не сработает. Прведи пример кода пожалуйста.
PM MAIL   Вверх
RAN
Дата 11.9.2003, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 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 - его поддерживают почти все серверы.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0398 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.