Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 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-сайт: basicproduction.nm.ru
 Профиль | | #2
Добавлено: 07.03.05 01:14
Монстры COM? Это тебе на vbSreet's надо. Там эти тварюги околачиваются :)

Ответить

Номер ответа: 3
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #3
Добавлено: 07.03.05 13:41
GSerg - это и есть монстр COM с vbstreets :)

Ответить

Номер ответа: 4
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #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-сайт: basicproduction.nm.ru
 Профиль | | #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-сайт: basicproduction.nm.ru
 Профиль | | #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
Интересно, они смешат или пугают?

Мы просто есть :)
А отношение к нам у всех своё.

А IDispatch, во-первых, дюжа тормозная фича

Зато она не страдает теми проблемами, о которых я говорил...

во-вторых - бесполезна в тех случаях когда требуется именно адрес callback функции.

Гы-гы-гы :)
А ты знаешь, что у каждой функции, являющейся членом vTable, есть неявный первый параметр - указатель на сам этот интерфейс? И, таким образом, параметров у неё на 1 больше, чем кажется? :) И этот первый параметр-таки нужно передать? А откуда его тебе возьмёт Windows?

Ответить

Номер ответа: 12
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #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-сайт: sharpc.livejournal.com
 Профиль | | #14
Добавлено: 10.03.05 08:47
Ой, откуда такое отрицательное отношение? Я чего-то пропустил?

Ответить

Номер ответа: 15
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #15 Добавлено: 10.03.05 09:37

А ты знаешь, что у каждой функции, являющейся членом vTable, есть неявный первый параметр - указатель на сам этот интерфейс? И, таким образом, параметров у неё на 1 больше, чем кажется? :) И этот первый параметр-таки нужно передать? А откуда его тебе возьмёт Windows?

Да мне, собственно, не нужно получать указатель на интерфейс откуда-либо. Я же не пишу COM компонент, мне эти правила соблюдать необязательно. Кроме того, на счет лишнего параметра - откуда ему взяться? Когда писал простенькие COM на С++ - там это дело более наглядно, никаких левых параметров не было...

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам