Описание класса объекта Form

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Описание класса объекта Form

Сообщение BP » 09.09.2004 (Чт) 16:12

Есть ли у кого такое описание? Я имею ввиду его члены и их размеры.
Или оно идентично WNDCLASSEX?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 09.09.2004 (Чт) 17:32

Сам понял чё спросил? :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 09.09.2004 (Чт) 21:34

Ты имеешь ввиду что оно уже есть в браузере объектов? Даже если есть, то всё равно VB всё сортирует.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 09.09.2004 (Чт) 21:48

CyRax, имей совесть :)
То, что ты видишь в VB по F2, суть vTable. То, что у объекта внутри, ты не узнаешь никогда. Во-первых, это нигде, окромя исходников, не описано, во-вторых, это прямо противоречит идеологии ООП. Если тебе нужны методы в порядке vTable – извлеки tlb из ресурсов (хотя, из чьих ресурсов?..) и смотри.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 09.09.2004 (Чт) 22:17

Да я просто когда то код видел, где человек менял оконную процедуру формы, записывая в память. Вот я и подумал что он знает её класс.

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 09.09.2004 (Чт) 22:22

BP писал(а):Да я просто когда то код видел, где человек менял оконную процедуру формы, записывая в память. Вот я и подумал что он знает её класс.


Забыл уточнить. Он писал по ObjPTr+смещение. Смещение уже не помню. Вот собственно и все побудившие меня причины.

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 09.09.2004 (Чт) 22:24

А пример назывался Субклассинг без модуля. Если кто не знает, то в VB субклассинг возможен только в модуле.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 09.09.2004 (Чт) 22:59

Значит знает.
ObjPtr++ - это действительно внутреннее поле объекта. Где он только его откопал, вражина, описание-то? И, главное, ЧТО он туда записывал? Адрес новой процедуры? Как он его получил, если она не в модуле?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 09.09.2004 (Чт) 23:34

Я думаю, он всего-навсего взял из VTable адрес какого-то метода, и его передавал в SetWindowLong.
Никакого рокет-сайенса.
Изображение

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 10.09.2004 (Пт) 0:25

Вот так:
Вложения
SubClassingWithoutModule.rar
(2.77 Кб) Скачиваний: 63

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 10.09.2004 (Пт) 1:13

BP писал(а):Вот так:

Собственно, я угадал :-)
При этом класс формы здесь нигде не используется; работа ведётся с VTable класса clsSubclass.
Ещё отмечу, что всё перестанет работать, если переместить WndProc из начала модуля куда-нибудь в середину или конец. Так что вывод - всё это очень шаткая конструкция, к тому же непонятно ради чего возведённая. Чем модули-то не устроили?
Изображение

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 10.09.2004 (Пт) 3:25

А как он собственно получил числа из этого vTable?
Код: Выделить всё
Private Function GetProcPtr(ClassPtr As Long, ProcNumber As Long) As Long
    Dim TempPtr As Long
    Dim ProcPtr As Long

    Call CopyMemory(TempPtr, ByVal ClassPtr, 4&)
    Call CopyMemory(ProcPtr, ByVal TempPtr + &H1C + (4& * ProcNumber), 4&)
    GetProcPtr = ProcPtr
End Function


Ну во первых, как видно из этого кода, значение в ObjPtr - уто указатель куда то.
А что это за волшебное &H1C. Ведь не по RND же он его нашёл ;)

Юстас
Бывалый
Бывалый
 
Сообщения: 200
Зарегистрирован: 24.10.2003 (Пт) 5:05

Сообщение Юстас » 10.09.2004 (Пт) 8:39

BP, да совсем оно и не волшебное, а вполне стандартное смещение, на котором от начала идут адреса процедур. Смотри файл OAIdl.h

tyomitch, ты перенёс процедуру в начало(конец) модуля, а вызываешь её по старому адресу, наверное поэтому не работает? А конструкция не шаткая, вполне обычный интерфейс.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 10.09.2004 (Пт) 12:56

Я вызываю процедуры не по адресу, а по имени. И поэтому у меня всё работает, даже когда я переношу процедуру в другое место.

Значение в ObjPtr - указатель на начало VTable.
В ней первые 7 мест заняты членами IDispatch, а потом идут методы самого класса.
Изображение

Юстас
Бывалый
Бывалый
 
Сообщения: 200
Зарегистрирован: 24.10.2003 (Пт) 5:05

Сообщение Юстас » 10.09.2004 (Пт) 14:19

ProcPtr = CreateASMContainer(ObjPtr(Me), 0) эту строку тоже ведь изменять надо, когда перетаскиваешь WndProc в середину

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 10.09.2004 (Пт) 17:37

Юстас писал(а):BP, да совсем оно и не волшебное, а вполне стандартное смещение, на котором от начала идут адреса процедур. Смотри файл OAIdl.h


Вот этот инклюд.
http://dotnet.di.unipi.it/Content/sscli ... ource.html

Покажи как там найти смещение 1C

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 10.09.2004 (Пт) 17:59

BP, я же уже объяснил, 1C=4*7, 4 байта в адресе, 7 членов в IDispatch-е. Теперь понятно?
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 10.09.2004 (Пт) 18:01

Не, юзать это нехорошо. Именно из-за переноса методов.
Лучше уж по-старинке...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 10.09.2004 (Пт) 18:13

tyomitch писал(а):BP, я же уже объяснил, 1C=4*7, 4 байта в адресе, 7 членов в IDispatch-е. Теперь понятно?

Это я понял. Спасибо что помог умножить 7 на 4 :) Мне нужно описание vTable.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 10.09.2004 (Пт) 18:31

Семь? Семь?! Ты же говорил 4... И ещё говорил, что это нуно знать :)
А, значит 4 члена, размер каждого 7! :lol:
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 10.09.2004 (Пт) 19:02

4 своих и 3 унаследованных.
Описание VTable: http://msdn.microsoft.com/library/en-us ... 5_78v9.asp
Изображение

Юстас
Бывалый
Бывалый
 
Сообщения: 200
Зарегистрирован: 24.10.2003 (Пт) 5:05

Сообщение Юстас » 10.09.2004 (Пт) 19:29

Или вот здесь немножко есть об этом:
http://www.wasm.ru/forum/index.php?acti ... topic=6898

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 10.09.2004 (Пт) 22:20

А Form это IUnknown или IDipatch?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 10.09.2004 (Пт) 22:35

Да при чём здесь форма? В твоём примере-то расковыривается VTable clsSubclass!

На всякий случай, форма - это IDispatch (притом недуальный).
Изображение

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 11.09.2004 (Сб) 12:40

Что то я запутался. Какой интерфейс нужно определять заранее IUnknown или IDispatch?
Судя по читанным ранее хелпам из PB, интерфейс IDispatch автоматически определяет методы и свойства. Так? Значит это уже хорошо что он Dispatch?

BP
Бывалый
Бывалый
 
Сообщения: 234
Зарегистрирован: 17.02.2004 (Вт) 5:34
Откуда: Украина

Сообщение BP » 11.09.2004 (Сб) 12:43

Да, и ещё, раз уж ты знаешь эту технологию не мог бы ты проверить правильно ли я перевёл описания интерфейсов в PB. В самом низу страницы.
http://basicproduction.nm.ru/POWERBASIC/PB7DataType.htm

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 11.09.2004 (Сб) 12:49

BP писал(а):Что то я запутался. Какой интерфейс нужно определять заранее IUnknown или IDispatch?
Судя по читанным ранее хелпам из PB, интерфейс IDispatch автоматически определяет методы и свойства. Так? Значит это уже хорошо что он Dispatch?

Поясни, пожалуйста, вопрос - а то я не понимаю, что ты спрашиваешь.
IUnknown и IDispatch определять не нужно - они уже лет восемь как определены.
Методы и свойства собственных (т.е. нестандартных) классов определяются их разработчиком, и к IDispatch не имеют никакого отношения.
То, что какой-то объект поддерживает IDispatch - безусловно хорошо :-)
Изображение


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 9

    TopList