![]() |
|
Модераторы: bsa |
![]()
|
|
| AZealot |
|
||||||||||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 25.4.2009 Репутация: нет Всего: нет |
Доброго времени суток!
Возникла необходимость создать несколько интерфейсов на VC++. Что я и сделал, основываясь на статье http://www.dtf.ru/articles/read.php?id=44995 В случае, если один интерфейс соответствует одному классу - всё работает нормально, но если я пытаюсь создать один класс с несколькими интерфейсами
И, в последствии вызываю функцию
то при попытке обратится к методам интерфейса IBar возникает ошибка
Пробежался отладчиком, и обнаружил, что при обращении к методам IBar, почему то, вызываются методы IFoo. Если в объявлении класса CFooBar поменять местами IFoo и IBar
то интерфейс IBar заработает, IFoo будет вылетать с ошибкой Методы IUnknown реализованы, __stdcall проставлено для всех функций. |
||||||||||
|
|||||||||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 12 Всего: 72 |
Интерфейс IUnknown реализован дважды. Если с интерфейсами используется тот же синаксис, что и для классов, писать нужно так:
|
|||
|
||||
| AZealot |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 25.4.2009 Репутация: нет Всего: нет |
Огромное спасибо, math64, вы мне очень помогли
|
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Если вы пытаетесь сделать COM'овский объект, то виртуально наследовать IUnknown не надо (их действительно должно быть два). А надо коректно реализовать метод QueryInterface в самом CFooBar.
Наследование его по умолчанию от неизвестно какого IUnknown работать не будет (что вы и получили) Кроме того, вызов foobar->QueryInterface(IID_IUnknown,(void**)ofb); с последующим использованием ofb как IBar** так же невалиден - вы просите IUnknown, а используете IBar. Нужно так: foobar->QueryInterface(IID_IBar,(void**)ofb); |
|||
|
||||
| AZealot |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 25.4.2009 Репутация: нет Всего: нет |
xvr, дело в том, что создаётся не полноценный COM объект, а только абстрактный класс, реализация которого лежит в dll. Хотя, попробую сделать так, как вы сказали.
|
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Это не важно. Если вы собираетесь работать с ним как с COM объектом, то и внутреняя структура и методы использования должны быть соотвествующие. И неважно, будет он создаваться через COM инфраструктуру и фабрику классов в dll, или напрямую какой нибудь функцией из dll |
|||
|
||||
| AZealot |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 25.4.2009 Репутация: нет Всего: нет |
Вы совершенно правы. Отредактировал QueryInterface как вы сказали, и действительно, всё заработало как задумывалось с самого начала. Спасибо, теперь вопрос решён полностью |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |