Страница: 1 | 2 |
Вопрос: vtbl объекта
Добавлено: 04.03.05 14:57
Автор вопроса: LamerOnLine | ICQ: 334781088
Я вот тут все парюсь над оптимизацией множественного сабклассинга. Есть определенная проблема. Через ObjPtr можно получить ссылку на vtbl. Оттуда получить ссылки на AddRef, Release, QueryInterface. Далее, как можно получить указатель на определенную функцию-член класса? Именно на фунцкцию (по имени), не на интерфейс по его IID. Монстры COM, выручайте!
Ответы
Всего ответов: 20
Номер ответа: 1
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #1
Добавлено: 06.03.05 14:48
Если есть указатель на vTable, то первый, второй и третий элементы этой vTable есть QueryInterface, AddRef и Release соответственно. Вслед за ними идут 4 функции IDispatch. Потом - все остальные.
Получать указатель на функцию класса по его vTable - занятие возможное, но неблагодарное и бесперспективное. Потому что любое изменение кода класса (добавил метод... убрал метод...) приводит к изменению vTable.
Для вызова методов по имени при незнании их положения в vTable и служит IDispatch. Для его прямого использования достаточно сохранить ссылку на объект в переменную типа Object, после чего вызвать метод как всегда, через точку.
Можно, для более явного обозначения происходящего, использовать CallByName.
Есть третий вариант (мне он кажется самым удобным) - объявить отдельный интерфейс ISubclass и Implements его в том объекте, который необходимо сабклассить. Собственно, я так и сделал, когда решал эту проблему: http://bbs.vbstreets.ru/viewtopic.php?t=13761
Номер ответа: 2
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #2
Добавлено: 07.03.05 01:14
Монстры COM? Это тебе на vbSreet's надо. Там эти тварюги околачиваются
Номер ответа: 3
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #3
Добавлено: 07.03.05 13:41
GSerg - это и есть монстр COM с vbstreets
Номер ответа: 4
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #4
Добавлено: 07.03.05 15:07
Не, там есть монстры COM и покрупнее
Номер ответа: 5
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #5
Добавлено: 09.03.05 09:56
Не, фокус в том что мне нужно именно получить адрес функции. Собственно, получить указатель на интерфейс через QueryInterface не проблемно, но вот выдернуть оттуда в runtime адрес нужной функции - уже запара. А IDispatch, во-первых, дюжа тормозная фича, во-вторых - бесполезна в тех случаях когда требуется именно адрес callback функции. Так же бесполезна CallByName. С третьим вариантом щас будем глядеть...
Номер ответа: 6
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #6
Добавлено: 09.03.05 09:57
P.S. Создается впечатление что vbstreets - прямо Корпорация Монстров Интересно, они смешат или пугают?
Номер ответа: 7
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #7
Добавлено: 09.03.05 11:12
Нет, они COM (и другие бесполезные вещи) знают
Номер ответа: 8
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #8
Добавлено: 09.03.05 11:21
Есть выражение такое: "Было бы очень смешно, если бы не было так грустно". Это как раз про vbstreets
COMики, одним словом ))
Номер ответа: 9
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #9
Добавлено: 09.03.05 12:54
Почти в точку, только нужно первую букву заменить на Gэ
Номер ответа: 10
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #10
Добавлено: 09.03.05 13:16
Можно и так
Номер ответа: 11
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #11
Добавлено: 10.03.05 02:08
Мы просто есть
А отношение к нам у всех своё.
Зато она не страдает теми проблемами, о которых я говорил...
Гы-гы-гы
А ты знаешь, что у каждой функции, являющейся членом vTable, есть неявный первый параметр - указатель на сам этот интерфейс? И, таким образом, параметров у неё на 1 больше, чем кажется? И этот первый параметр-таки нужно передать? А откуда его тебе возьмёт Windows?
Номер ответа: 12
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #12
Добавлено: 10.03.05 03:07
"Было бы очень смешно, если бы не было так грустно". Это как раз про vbstreets
Угу, я бы стеснялся на улицу выходить если бы был "монстром" C(G)OM'иком с vBsreetss.
Чего только стоит:
Мы просто есть
Налицо явно преувеличенная мания величия.
Или эти великие слова:
И, таким образом, параметров у неё на 1 больше, чем кажется?
Хороший вопрос из цикла "от великого до смешного". Интересно, чем кажется COM'икам с VbSREEts? Наверное тем же местом, которым они думают.
Номер ответа: 13
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #13
Добавлено: 10.03.05 04:13
Наверное, всё-таки тем, которым сидят
Номер ответа: 14
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #14
Добавлено: 10.03.05 08:47
Ой, откуда такое отрицательное отношение? Я чего-то пропустил?
Номер ответа: 15
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #15
Добавлено: 10.03.05 09:37
А ты знаешь, что у каждой функции, являющейся членом vTable, есть неявный первый параметр - указатель на сам этот интерфейс? И, таким образом, параметров у неё на 1 больше, чем кажется? И этот первый параметр-таки нужно передать? А откуда его тебе возьмёт Windows?
Да мне, собственно, не нужно получать указатель на интерфейс откуда-либо. Я же не пишу COM компонент, мне эти правила соблюдать необязательно. Кроме того, на счет лишнего параметра - откуда ему взяться? Когда писал простенькие COM на С++ - там это дело более наглядно, никаких левых параметров не было...